Multithreading Powershell多线程数学
我目前正在进行一个学习powershell的自我激励项目,并一直在编写一个生成素数的脚本。目前,该脚本可以正常工作,但我的下一个目标是提高它的处理速度Multithreading Powershell多线程数学,multithreading,powershell,primes,prime-factoring,Multithreading,Powershell,Primes,Prime Factoring,我目前正在进行一个学习powershell的自我激励项目,并一直在编写一个生成素数的脚本。目前,该脚本可以正常工作,但我的下一个目标是提高它的处理速度 cls $Primes = @() $Primes += 3 $TargetNum = 5 $PrimesIndex = 0 $NumOfPrime = 3 while(1) { if(($TargetNum / 3) -lt 3) { $Primes += $TargetNum $TargetN
cls
$Primes = @()
$Primes += 3
$TargetNum = 5
$PrimesIndex = 0
$NumOfPrime = 3
while(1)
{
if(($TargetNum / 3) -lt 3)
{
$Primes += $TargetNum
$TargetNum += 2
$NumOfPrime += 1
}
else
{
if($Primes[$PrimesIndex] -le ($TargetNum / ($Primes[$PrimesIndex])))
{
if($TargetNum % $Primes[$PrimesIndex] -eq 0)
{
$PrimesIndex = 0
$TargetNum += 2
}
else
{
$PrimesIndex++
}
}
else
{
$PrimesIndex = 0
$NumOfPrime += 1
$Primes += $TargetNum
$TargetNum += 2
if($TargetNum -gt 100000){write-host $TargetNum ", " $NumOfPrime;break}
}
}
}
如果我执行语句Measure命令{&“\primes.ps1”}
它将计算≈ 9.1秒(无论如何对我来说),但这只是使用单个CPU线程执行计算。
我曾研究过使用start job
和start process
命令来实现某种多线程,但我无法理解它们是如何工作的
如果我将基本测试计算转移到一个函数,我将如何在我的所有4个逻辑核上调用该函数?也许创建第二个powershell脚本,我可以传递一个值进行测试,然后开始这个过程?上面的脚本在前10秒内平均解决10000个素数\秒,powershell是否能够快速启动和停止一些工作脚本?必须分别考虑两个术语:异步和并行编程。第一个任务提供了对任意任务的简单后台执行,而第二个任务要求您(作为算法的作者)将任务拆分为几个独立的任务,以便能够在单独的计算单元(核心、处理器、机器)上运行它们 您可以使用函数轻松启动异步任务,但它不会为您提供并行计算:
Start-Job -Name "GetPrimes" -ScriptBlock {MyPrimesFunction} | Wait-Job | Receive-Job
实现并行性的一个简单方法是将函数拆分为块(例如,按搜索素数的几个间隔),然后使用开始作业运行每个块
:
$jobs = @()
# gather all jobs into an array
$jobs += Start-Job -ScriptBlock {MyPrimesFunction1}
$jobs += Start-Job -ScriptBlock {MyPrimesFunction2}
$jobs += Start-Job -ScriptBlock {MyPrimesFunction3}
$jobs += Start-Job -ScriptBlock {MyPrimesFunction4}
# wait for all jobs
Wait-Job $jobs | Out-Null
# get result arrays from jobs
$results = $jobs | Receive-Job
$primes = @()
# merge results into single array
foreach ($result in $results) {
$primes += $result
}
请注意,函数必须以素数数组的形式返回结果。您必须重写函数4次,每次使用不同的数字间隔
处理作业的方法依赖于系统进程管理(因为每个作业启动单独的powershell.exe)。另一种方法是使用运行空间。你可以阅读