当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 启动线程作业(ThreadJob)

作者:精品下载站 日期:2024-12-14 20:28:43 浏览:15 分类:玩电脑

启动线程作业(ThreadJob)


Start-ThreadJob

模块 :ThreadJob

创建类似于 Start-Job cmdlet 的后台作业。

句法

Start-ThreadJob
     [-ScriptBlock] <ScriptBlock>
     [-Name <String>]
     [-InitializationScript <ScriptBlock>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [-ThrottleLimit <Int32>]
     [-StreamingHost <PSHost>]
     [<CommonParameters>]
Start-ThreadJob
     [-FilePath] <String>
     [-Name <String>]
     [-InitializationScript <ScriptBlock>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [-ThrottleLimit <Int32>]
     [-StreamingHost <PSHost>]
     [<CommonParameters>]

描述

Start-ThreadJob 创建类似于 Start-Job cmdlet 的后台作业。主要区别在于创建的作业在本地进程内的单独线程中运行。默认情况下,作业使用启动作业的调用者的当前工作目录。

该 cmdlet 还支持 ThrottleLimit 参数来限制一次运行的作业数量。随着越来越多的作业启动,它们会排队等待,直到当前作业数量低于限制。

示例

示例 1 - 创建线程限制为 2 的后台作业

Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } } -ThrottleLimit 2
Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } }
Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } }
Get-Job

Id   Name   PSJobTypeName   State        HasMoreData   Location     Command
--   ----   -------------   -----        -----------   --------     -------
1    Job1   ThreadJob       Running      True          PowerShell   1..100 | % { sleep 1;...
2    Job2   ThreadJob       Running      True          PowerShell   1..100 | % { sleep 1;...
3    Job3   ThreadJob       NotStarted   False         PowerShell   1..100 | % { sleep 1;...

示例 2 - 比较 Start-Job 和 Start-ThreadJob 的性能

此示例显示了 Start-JobStart-ThreadJob 之间的区别。这些作业运行 Start-Sleep cmdlet 1 秒。由于作业并行运行,因此总执行时间约为 1 秒,加上创建作业所需的任何时间。

# start five background jobs each running 1 second
Measure-Command {1..5 | % {Start-Job {Start-Sleep 1}} | Wait-Job} | Select-Object TotalSeconds
Measure-Command {1..5 | % {Start-ThreadJob {Start-Sleep 1}} | Wait-Job} | Select-Object TotalSeconds

TotalSeconds
------------
   5.7665849
   1.5735008

减去 1 秒的执行时间后,您可以看到 Start-Job 创建 5 个作业大约需要 4.8 秒。 Start-ThreadJob 速度提高了 8 倍,创建 5 个作业大约需要 0.6 秒。结果可能因您的环境而异,但相对改进应该是相同的。

示例 3 - 使用 InputObject 创建作业

在此示例中,脚本块使用 $input 变量接收来自 InputObject 参数的输入。这也可以通过将对象管道传输到 Start-ThreadJob 来完成。

$j = Start-ThreadJob -InputObject (Get-Process pwsh) -ScriptBlock { $input | Out-String }
$j | Wait-Job | Receive-Job

NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     94   145.80     159.02      18.31   18276   1 pwsh
    101   163.30     222.05      29.00   35928   1 pwsh

$j = Get-Process pwsh | Start-ThreadJob -ScriptBlock { $input | Out-String }
$j | Wait-Job | Receive-Job

NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     94   145.80     159.02      18.31   18276   1 pwsh
    101   163.30     222.05      29.00   35928   1 pwsh

示例 4 - 将作业输出流式传输到父主机

使用StreamingHost参数,您可以告诉作业将所有主机输出定向到特定主机。如果没有此参数,输出将进入作业数据流集合,并且在您收到作业的输出之前不会出现在主机控制台中。

在此示例中,使用 $Host 自动变量将当前主机传递给 Start-ThreadJob

PS> Start-ThreadJob -ScriptBlock { Read-Host 'Say hello'; Write-Warning 'Warning output' } -StreamingHost $Host

Id   Name   PSJobTypeName   State         HasMoreData     Location      Command
--   ----   -------------   -----         -----------     --------      -------
7    Job7   ThreadJob       NotStarted    False           PowerShell    Read-Host 'Say hello'; ...

PS> Say hello: Hello
WARNING: Warning output
PS> Receive-Job -Id 7
Hello
WARNING: Warning output
PS>

请注意,将显示来自 Read-Host 的提示,并且您可以键入输入。然后,显示来自 Write-Warning 的消息。 Receive-Job cmdlet 返回作业的所有输出。

示例 5 - 同时下载多个文件

Invoke-WebRequest cmdlet 一次只能下载一个文件。以下示例使用 Start-ThreadJob 创建多个线程作业以同时下载多个文件。

$baseUri = 'https://github.com/PowerShell/PowerShell/releases/download'
$files = @(
    @{
        Uri = "$baseUri/v7.3.0-preview.5/PowerShell-7.3.0-preview.5-win-x64.msi"
        OutFile = 'PowerShell-7.3.0-preview.5-win-x64.msi'
    },
    @{
        Uri = "$baseUri/v7.3.0-preview.5/PowerShell-7.3.0-preview.5-win-x64.zip"
        OutFile = 'PowerShell-7.3.0-preview.5-win-x64.zip'
    },
    @{
        Uri = "$baseUri/v7.2.5/PowerShell-7.2.5-win-x64.msi"
        OutFile = 'PowerShell-7.2.5-win-x64.msi'
    },
    @{
        Uri = "$baseUri/v7.2.5/PowerShell-7.2.5-win-x64.zip"
        OutFile = 'PowerShell-7.2.5-win-x64.zip'
    }
)

$jobs = @()

foreach ($file in $files) {
    $jobs += Start-ThreadJob -Name $file.OutFile -ScriptBlock {
        $params = $using:file
        Invoke-WebRequest @params
    }
}

Write-Host "Downloads started..."
Wait-Job -Job $jobs

foreach ($job in $jobs) {
    Receive-Job -Job $job
}

参数

-ArgumentList

为由 FilePathScriptBlock 参数指定的脚本指定参数或参数值的数组。

ArgumentList 必须是命令行上的最后一个参数。参数名称后面的所有值都是参数列表中的解释值。

类型 :

Object[]

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-FilePath

指定作为后台作业运行的脚本文件。输入脚本的路径和文件名。该脚本必须位于本地计算机上或本地计算机可以访问的文件夹中。

使用此参数时,PowerShell 会将指定脚本文件的内容转换为脚本块,并将该脚本块作为后台作业运行。

类型 :

String

位置:

0

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

-InitializationScript

指定作业启动之前运行的命令。将命令括在大括号 ({}) 中以创建脚本块。

使用此参数准备运行作业的会话。例如,您可以使用它向会话添加功能和模块。

类型 :

ScriptBlock

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-InputObject

指定用作脚本块输入的对象。它还允许管道输入。在脚本块中使用 $input 自动变量来访问输入对象。

类型 :

PS对象

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

True

接受通配符:

False

-Name

为新作业指定一个友好名称。您可以使用该名称来向其他作业 cmdlet(例如 Stop-Job cmdlet)标识该作业。

默认友好名称是“Job#”,其中“#”是每个作业递增的序号。

类型 :

String

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-ScriptBlock

指定要在后台作业中运行的命令。将命令括在大括号 ({}) 中以创建脚本块。使用 $Input 自动变量访问 InputObject 参数的值。此参数是必需的。

类型 :

ScriptBlock

位置:

0

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

-StreamingHost

此参数提供了一种线程安全的方法,允许 Write-Host 输出直接转到传入的 PSHost 对象。如果没有它,Write-Host 输出将进入作业信息数据流集合,并且在作业完成运行之前不会出现在主机控制台中。

类型 :

PS主机

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-ThrottleLimit

该参数限制一次运行的作业数量。当作业启动时,它们会排队等待,直到线程池中有可用的线程来运行作业。默认限制为 5 个线程。

线程池大小对于 PowerShell 会话来说是全局的。在一次调用中指定 ThrottleLimit 可以设置同一会话中后续调用的限制。

类型 :

整数32

位置:

命名

默认值:

5

必需的:

False

接受管道输入:

False

接受通配符:

False

输入

PSObject

输出

ThreadJob.ThreadJob

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯