powershell如何实现工作线程

时间:2013-11-24 18:49:05

标签: multithreading powershell subprocess

我的脚本中有一点性能问题,所以我想实现某种工作者theads。但到目前为止我还没有找到解决方案..

我希望是这样的:

  • 启动一个工作线程池 - 这些线程从队列中获取“命令”并处理它们
  • 主脚本会在运行时将“命令”写入队列
  • 一旦完成主要将告诉每个线程停止
  • main将等待所有工人在退出前结束。

有没有人知道如何做到这一点?

3 个答案:

答案 0 :(得分:0)

您可以使用Powershell工作流程执行此操作。

来自Windows PowerShell: What is Windows PowerShell Workflow?

  

如果您愿意,工作流程也可以并行执行。对于   例如,如果您有一组可以按任何顺序运行的任务,则没有   相互依赖,然后你可以让他们都或多或少地运行   同一时间

只需搜索“Powershell工作流程”,您就会找到大量文档来帮助您入门。

答案 1 :(得分:0)

使用工作的基本方法是:

$task1 = { ls c:\windows\system32 -r *.dll -ea 0 | where LastWriteTime -gt (Get-Date).AddDays(-21) }
$task2 = { ls E:\Symbols -r *.dll | where LastWriteTime -gt (Get-Date).AddDays(-21) }
$task3 = { Invoke-WebRequest -Uri http://blogs.msdn.com/b/mainfeed.aspx?Type=BlogsOnly | % Content }

$job1 = Start-Job $task1; $job2 = Start-Job $task2; $job3 = Start-Job $task3
Wait-Job $job1,$job2,$job3

$job1Data = Receive-Job $job1
$job2Data = Receive-Job $job2
$job3Data = Receive-Job $job3

如果您需要让这些后台作业在循环中等待工作,因为主脚本要求查看this SO answer以了解如何使用MSMQ来执行此操作。

答案 2 :(得分:0)

在Keith Hill指出的一些帮助下 - 我得到了它的工作 - 感谢一堆......

这是对我的概念证明的代码的剪切:

function New-Task([int]$Index,[scriptblock]$ScriptBlock) {
    $ps = [Management.Automation.PowerShell]::Create()
    $res = New-Object PSObject -Property @{
        Index = $Index
        Powershell = $ps
        StartTime = Get-Date
        Busy = $true
        Data = $null
        async = $null
    }

    [Void] $ps.AddScript($ScriptBlock)
    [Void] $ps.AddParameter("TaskInfo",$Res)
    $res.async = $ps.BeginInvoke()
    $res
}

$ScriptBlock = {
    param([Object]$TaskInfo) 
    $TaskInfo.Busy = $false
    Start-Sleep -Seconds 1
    $TaskInfo.Data = "test $($TaskInfo.Data)"
}

$a = New-Task -Index 1 -ScriptBlock $ScriptBlock 
$a.Data = "i was here"
Start-Sleep -Seconds 5
$a

这里的结果证明数据已传递到线程中并再次传回:

Data       : test i was here
Busy       : False
Powershell : System.Management.Automation.PowerShell
Index      : 1
StartTime  : 11/25/2013 7:37:07 AM
async      : System.Management.Automation.PowerShellAsyncResult

你可以看到$ a.data现在在前面有“测试”

非常感谢...