Start-ThreadJob

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

语法

Start-ThreadJob
     [-ScriptBlock] <ScriptBlock>
     [-Name <String>]
     [-InitializationScript <ScriptBlock>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [-ThrottleLimit <Int32>]
     [<CommonParameters>]
Start-ThreadJob
     [-FilePath] <String>
     [-Name <String>]
     [-InitializationScript <ScriptBlock>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [-ThrottleLimit <Int32>]
     [<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 秒后,可以看到,创建 5 个作业 Start-Job 大约需要 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

参数

-ArgumentList

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

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

类型:Object[]
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-FilePath

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

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

类型:String
Position:0
默认值:None
必需:True
接受管道输入:False
接受通配符:False

-InitializationScript

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

使用此参数准备运行作业的会话。 例如,可以使用它将函数和模块添加到会话。

类型:ScriptBlock
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-InputObject

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

类型:PSObject
Position:Named
默认值:None
必需:False
接受管道输入:True
接受通配符:False

-Name

指定新作业的友好名称。 可以使用名称将作业标识到其他作业 cmdlet,例如 Stop-Job cmdlet。

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

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-ScriptBlock

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

类型:ScriptBlock
Position:0
默认值:None
必需:True
接受管道输入:False
接受通配符:False

-ThrottleLimit

此参数限制一次运行的作业数。 启动作业时,会排队等待线程在线程池中可用以运行作业。 默认限制为 5 个线程。

线程池大小是 PowerShell 会话的全局大小。 在一个调用中指定 ThrottleLimit 会设置同一会话中后续调用的限制。

类型:Int32
Position:Named
默认值:5
必需:False
接受管道输入:False
接受通配符:False

输入

PSObject

输出

ThreadJob.ThreadJob