Multithreading 运行空间和作业之间的性能差异
我构建了一个文件处理器脚本来将一些文件转换为json。它可以工作,但速度不够快,所以我使用多线程。我更喜欢使用运行空间池,因为您可以指定一个最大线程限制,它将一次运行那么多线程,并在完成其他线程时添加新的工作,spiffy。但是我发现,如果我有,比如说,6个线程的工作要完成,使用运行空间需要约50分钟,并使我的计算机保持40%的CPU,而仅仅使用开始作业的每一项工作将使我的计算机保持100%的CPU,并且工作在15分钟内完成。我是否在某种程度上误解了runspacepool?下面是每种方法的简化示例Multithreading 运行空间和作业之间的性能差异,multithreading,powershell,Multithreading,Powershell,我构建了一个文件处理器脚本来将一些文件转换为json。它可以工作,但速度不够快,所以我使用多线程。我更喜欢使用运行空间池,因为您可以指定一个最大线程限制,它将一次运行那么多线程,并在完成其他线程时添加新的工作,spiffy。但是我发现,如果我有,比如说,6个线程的工作要完成,使用运行空间需要约50分钟,并使我的计算机保持40%的CPU,而仅仅使用开始作业的每一项工作将使我的计算机保持100%的CPU,并且工作在15分钟内完成。我是否在某种程度上误解了runspacepool?下面是每种方法的简化
### Using Start-Job ###
$files = C:\temp | Get-Childitem -filter '*.xel' # returns 6 items
foreach ($file in $files) {
#simplified
Start-Job -ScriptBlock { C:\temp\FileProcessor.ps1 -filepath $using:file.fullname }
}
### Using Runspace Pool ###
$files = C:\temp | Get-Childitem -filter '*.xel' # returns 6 items
$Code = {
param ($filepath)
#simplified
C:\temp\FileProcessor.ps1 -filepath $filepath
}
$rsPool = [runspacefactory]::CreateRunspacePool(1,100)
$rsPool.Open()
$threads = @()
foreach ($file in $files) {
$PSinstance = [powershell]::Create().AddScript($Code).AddArgument($file.FullName)
$PSinstance.RunspacePool = $rsPool
$threads += $PSinstance.BeginInvoke()
}
while ($threads.IsCompleted -contains $False) {}
$rsPool.Dispose()
我也可能会误解运行空间与作业相比,欢迎任何帮助。谢谢大家! 作业使用多个进程