2013-11-24 55 views
0

我的脚本中有一点性能问题,所以我想实现某种工作方式。但到目前为止,我还没有能够找到解决的办法..powershell如何实现工作线程

什么IM希望的是这样的:

  • 开始工作线程池 - 这些线程以“命令”从队列和处理它们
  • 主脚本会运行
  • 一旦完成主会告诉每一个线程停止
  • 主要将等待所有工人退出之前结束写“命令”的队列中。

有没有人有想法如何做到这一点?

+2

你到目前为止尝试过什么?您是否调查了后台作业或运行空间池? – mjolinor

+0

是的,我从开始工作开始,但到目前为止没有任何运气从主线传播到工作。 runspace;我看了几个例子,但它看起来非常复杂,与事件相同.. 我需要能够处理每半小时100.000个事件〜每秒95个事件 – Stig

回答

0

与基思·希尔指针一些帮助 - 我得到它的工作 - 感谢一大堆...

这里是做了代码的剪断我的证明概念:

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前

012具有“测试”

所以非常感谢...

0

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

Windows PowerShell: What is Windows PowerShell Workflow?

工作流还可以并行执行的东西,如果你喜欢。对于 例如,如果你有一组可以按任意顺序运行的任务,没有 相互依赖关系,那么你可以让他们在或多或少 同时全部运行

只是做的“搜索Powershell工作流程“,你会发现大量的文档让你开始。

+0

这可能是一种可能性,需要进一步调查。 – Stig

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来做到这一点。

+0

是的,我知道开始工作..使用了这么多 - 但到目前为止,我一直都能够在任务开始后与任务进行交流 - 这正是我需要的。 – Stig

+0

您是否按照答案中的链接 - 完全描述*如何做到这一点? –

+0

是的,但由于服务器需要执行,我无法使用消息传递服务。 – Stig