总的来说,我对工作流和PS非常陌生。下面是我使用工作流编写并行进程脚本的尝试。
Set-Location -Path "D:/Users/Derek/PostGrad/BTCParser"
$startDate = Get-Date "1/12/2018"
$currentDate = Get-Date
$temp = $currentDate.ToShortDateString
$ts = New-TimeSpan -Start $startDate -End $currentDate
$DayCount = $ts.Days
$parseDate = $startDate
$dateList = New-Object System.Collections.ArrayList($null)
For ($i = 0; $i -lt $DayCount; $i++){ #I miss you already python
$dateList.Add($parseDate)
$parseDate = $parseDate.AddDays(1)
}
$DayCount
scraper($dateList)
Workflow scraper{
param(
[Parameter (Mandatory = $true)]
[System.Collections.ArrayList]$dateList
)
ForEach -Parallel ($date in $dateList)
{
$endDate = $date.AddDays(1)
$startDateString = $date.ToString("yyyy-MM-dd")
$endDateString = $endDate.ToString("yyyy-MM-dd")
$twitterScraperString = $startDateString + "BTCtweets.json"
twitterscraper "Bitcoin OR BTC " -begindate $startDateString -enddate $endDateString --"limit" 20 -o =$twitterScraperString
}}
现在,进程只是按顺序执行,解析器就会运行,一旦它完成了它的执行,另一个进程就会启动。
查看关于工作流的正式windows文档,这是我设计的脚本的一部分。
您可以使用ForEach -Parallel构造同时处理集合中每个项的命令。集合中的项是并行处理的,而脚本块中的命令则按顺序运行。这使用如下所示的语法。在本例中,对于集合中的所有项,Activity1将同时启动。对于每个项目,Activity2将在Activity1完成后启动。Activity3只有在Activity1和Activity2都完成了所有项目之后才会启动。PowerShell
ForEach -Parallel ($<item> in $<collection>)
{
<Activity1>
<Activity2>
}
<Activity3>根据我的解释,my每个循环中的所有内容都构成活动1,应该并行执行。我是不是漏了个识别标签什么的?正如我前面说过的,这个过程只对每个日期依次执行。
此外,如果有任何超级用户在那里,我想进一步微调这个过程,使只有一定数量的活动是并行地在一次。例如,如果我有20个日期,我只希望同时运行10个日期活动。这是因为刮板程序在内存中保存所有已刮过的数据,直到它完成为止,而且我不想冒险让我所有的刮取过程都失败,因为它们耗尽了内存。
下面是我创建的一个顺序循环,它将实现该功能,但我不知道如何并行化它。有什么好主意吗?
谢谢!
发布于 2018-01-30 00:04:51
我不确定工作流是否是您应该寻找的。回顾一些工作流程基础。我的感觉是,它们更适合为许多工作站和/或服务器提供就业机会。工作流程中也存在语言限制,这将增加更多的挫折感。
您的循环看起来像是做了一些日期运算和字符串处理,然后调用twitterscraper "Bitcoin OR BTC " ...从另一个进程获取数据。我怀疑您只需要twitscraper调用就可以异步运行。Powershell乔布斯可能更适合这种情况。
https://stackoverflow.com/questions/48509840
复制相似问题