multithreading - 使用 Start-Process 时 Invoke-Parallel 正在等待
问题描述
有谁知道为什么Invoke-Parallel不是多线程?当我运行这个循环时,它不会启动下一个脚本块,直到前一个脚本块完成。
注意我也在PoshRSJob上试过这个。
我正在为找到的每个文件运行一个 Java jar 文件。如果你看这里,他们正在使用 Start-Process 命令并等待 rar.exe。
. .\Invoke-Parallel.ps1
$ScriptBlock = {
start-Process -file java -ArgumentList @('-jar',"a:\conversion.jar",$_.FullName,"$($_.FullName).tmp") -Wait
}
ForEach ($file in (GCI -Path b:\*)) {
Invoke-Parallel -InputObject $file -ScriptBlock $ScriptBlock -Throttle 5
}
*请注意,这只是一个简单的示例,我的原始脚本更复杂,但我将其缩小到此条目,这导致多线程不是多线程。
解决方案
这些多线程工具(Invoke-Parallel和PoshRSJob)需要流水线
我没有流水线化我的原始代码,因为我认为使用循环更干净。但是使用管道确实有效。
. .\Invoke-Parallel.ps1
$ScriptBlock = {
start-Process -file java -ArgumentList @('-jar',"a:\conversion.jar",$_.FullName,"$($_.FullName).tmp") -Wait
}
(GCI -Path b:\*) | Invoke-Parallel -InputObject $_ -ScriptBlock $ScriptBlock -Throttle 5
推荐阅读
- mplab - MPLAB:XC8:无法分配结构变量
- php - 为什么对象中的套接字设置为0
- angularjs - 如何处理数组(或手动处理 ng-repeat)?
- java - PreferenceScreen 中的 ColorAccent 在 API <=22 中无法正常工作
- fortran - 通用“mpi_send”没有特定的子程序
- javascript - 防止 javascript 将数组释放到垃圾收集器
- suitescript - SuiteScript 从标题字段自动填充订单项字段
- sandbox - 管理 C# 脚本的安全性和资源使用
- java - 无法使用 Java 为 zip64 类型提取 zip 文件
- java - Androidplot - 设置边距和填充(调整标签)