Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Powershell多线程数学_Multithreading_Powershell_Primes_Prime Factoring - Fatal编程技术网

Multithreading 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

我目前正在进行一个学习powershell的自我激励项目,并一直在编写一个生成素数的脚本。目前,该脚本可以正常工作,但我的下一个目标是提高它的处理速度

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)。另一种方法是使用运行空间。你可以阅读