在PowerShell中,可以通过后台Job来达到并行的目的。但是有些情况下,Job用起来并不方便,比如有一个文本文件,里面有几十万个链接,要求下载这些链接中的资源。这必须要用到并行处理,但是你不可能开十几万个Job同时处理,机器的性能不允许,网络带宽也不允许,那多少个Job才合适呢?5个还是10个?事实上,这个问题不应当交给用户去思考。
在.NET中,有Parallel.For 和 Parallel.ForEach,在PowerShell中也有Parallel。切看下面的例子,两个简单的循环,每次循环中,Sleep 50毫秒来模拟执行任务。前者Test-workflow为并行循环,后者Test-function为顺序函数。然后让设定循环分别为50,100,500,1000,5000来测试效率。
#并行工作流 workflow Test-workflow { param([int]$num) foreach -parallel ($item in 1..$num) { sleep -Milliseconds 50 } } #顺序函数 function Test-function { param([int]$num) 1..$num | foreach { sleep -Milliseconds 50 } } #测试脚本 foreach ($loop in 50,100,500,1000,5000) { $work = ( Measure-Command -Expression { Test-workflow -num $loop } ).TotalSeconds $func = ( Measure-Command -Expression { Test-function -num $loop } ).TotalSeconds "数据量={0},顺序执行={1},并行执行={2}" -f $loop,$func,$work }
输出:
数据量=50,顺序执行=3.1173647,并行执行=0.4106994 数据量=100,顺序执行=6.2382128,并行执行=0.7431548 数据量=500,顺序执行=31.2459768,并行执行=1.9244321 数据量=1000,顺序执行=62.4976644,并行执行=3.7015623 数据量=5000,顺序执行=312.4902384,并行执行=16.5361578
对输出稍微在Excel中对比后,发现数据量越大,越能体现出并行的优势:
本文链接: https://www.pstips.net/powershell-parall.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
觉得非常不错,但是在PS2.0中无法使用-parallel参数。
那就只能老老实实用job了,1万个任务,你启动10个后台job,把任务平分一下。
不太理解,用-parallel参数同时最多跑多少个job呢?根据系统性能自动算吗?
如果是c#中,有一个parallel option可以配置。但是powershell好像没有提供类似的配置,估计系统会自动算。
再问个小问题哈,win7或window2008可以安装ps3.0吗?
win7和2k8都需要先打SP1 补丁,然后就可以装powershell 3.0了。然后PS4.0也是一样的,建议直接装4.0。
“数据量={0},并行执行={1},顺序执行={2}” -f $loop,$func,$work->”数据量={0},并行执行={1},顺序执行={2}” -f $loop,$work,$func这个打错了吧
好眼力,谢谢提醒
Where is the script that you used to test the Parallel.ForEach approach? Can you provide the code here or elsewhere (such as a Gist)?
Hi,
the script has been included in current post.
I defined two snippets, “Test-workflow” and “Test-function”, then invoke them 50,100,500,1000 times, to measure there total time.