Multithreading powershell如何实现工作线程

Multithreading powershell如何实现工作线程,multithreading,powershell,subprocess,Multithreading,Powershell,Subprocess,我的脚本中有一点性能问题,所以我想实现一些工作线程。但到目前为止,我还没有找到解决办法 我希望是这样的: 启动工作线程池-这些线程从队列中获取“命令”并处理它们 主脚本将在队列运行时向队列写入“命令” 完成后,主线程将通知每个线程停止 main将等待所有工人退出 有人知道如何做到这一点吗?您可以使用Powershell工作流来做到这一点 从 如果您愿意,工作流也可以并行执行。对于 例如,如果您有一组任务可以按任何顺序运行,并且没有 相互依赖性,然后您可以让它们或多或少以相同的速度运行 同时

我的脚本中有一点性能问题,所以我想实现一些工作线程。但到目前为止,我还没有找到解决办法

我希望是这样的:

  • 启动工作线程池-这些线程从队列中获取“命令”并处理它们
  • 主脚本将在队列运行时向队列写入“命令”
  • 完成后,主线程将通知每个线程停止
  • main将等待所有工人退出

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

您可以使用Powershell工作流来做到这一点

如果您愿意,工作流也可以并行执行。对于 例如,如果您有一组任务可以按任何顺序运行,并且没有 相互依赖性,然后您可以让它们或多或少以相同的速度运行 同时


只要在“Powershell工作流”上搜索一下,您就会找到大量的文档来帮助您入门。

使用作业的基本方法如下:

$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

如果您需要让那些后台作业在循环中等待,以便按照主脚本的指示执行工作,请查看如何使用MSMQ来执行此操作。

在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现在前面有“test”


非常感谢……

到目前为止你都试了些什么?你调查过后台作业或运行空间池吗?是的,我从开始作业开始,但到目前为止还没有从主线程到作业的通信。运行空间;我看了几个例子,但似乎很复杂,事件也是如此。。我需要能够处理每半小时100.000个事件,每个部门95个事件。这可能是一种可能性,需要进一步调查。是的,我知道开始工作。。使用了很多-但到目前为止,我还无法在任务启动后与任务进行通信-这正是我所需要的。您是否按照答案中的链接进行了操作-该链接准确地描述了如何执行该操作?是的,但我无法使用messagequeuing服务,因为需要执行该服务的服务器。但这可能会增加其他可能性,我需要进一步调查。在我看来,你的选择是有限的:作业、运行空间、工作流。作业和工作流都运行“进程外”,因此需要某种形式的IPC。运行空间池可能是最好的解决方案,因为这些运行在进程中,所以您应该能够使用.NET队列(BlockingCollection)将数据传递给工作脚本。