[玩转系统] 关于线程作业
作者:精品下载站 日期:2024-12-14 02:17:55 浏览:12 分类:玩电脑
关于线程作业
简短描述
提供有关 PowerShell 基于线程的作业的信息。线程作业是一种后台作业,它在当前会话进程内的单独线程中运行命令或表达式。
详细描述
PowerShell 通过作业同时运行命令和脚本。 PowerShell 提供了三种作业类型来支持并发。
RemoteJob
- 命令和脚本在远程会话中运行。有关信息,请参阅 about_Remote_Jobs。BackgroundJob
- 命令和脚本在本地计算机上的单独进程中运行。有关更多信息,请参阅 about_Jobs。PSTaskJob
或ThreadJob
- 命令和脚本在本地计算机上同一进程内的单独线程中运行。
基于线程的作业不如远程作业和后台作业健壮,因为它们在同一进程的不同线程上运行。如果一项作业出现导致进程崩溃的严重错误,则该进程中的所有其他作业都会终止。
然而,基于线程的作业需要较少的开销。他们不使用远程处理层或序列化。结果对象作为对当前会话中活动对象的引用返回。如果没有这种开销,基于线程的作业比其他作业类型运行得更快并且使用的资源更少。
这很重要
创建作业的父会话还会监视作业状态并收集管道数据。一旦作业达到完成状态,作业子进程就会被父进程终止。如果父会话终止,所有正在运行的子作业及其子进程都会终止。
有两种方法可以解决这种情况:
- 使用
Invoke-Command
创建在断开连接的会话中运行的作业。有关详细信息,请参阅 about_Remote_Jobs。 - 使用
Start-Process
创建新进程而不是作业。有关详细信息,请参阅启动进程。
如何启动和管理基于线程的作业
有两种方法可以启动基于线程的作业:
Start-ThreadJob
- 来自ThreadJob模块ForEach-Object -Parallel -AsJob
- PowerShell 7.0 中添加了并行功能
使用 about_Jobs 中描述的相同 Job cmdlet 来管理基于线程的作业。
使用Start-ThreadJob
ThreadJob 模块首先随 PowerShell 6 一起提供。它也可以从 Windows PowerShell 5.1 的 PowerShell 库中安装。
要在本地计算机上启动线程作业,请使用 Start-ThreadJob
cmdlet,并将命令或脚本括在大括号 ({ }
) 中。
以下示例启动一个线程作业,该作业在本地计算机上运行 Get-Process
命令。
Start-ThreadJob -ScriptBlock { Get-Process }
Start-ThreadJob
命令返回一个表示正在运行的作业的 ThreadJob
对象。作业对象包含有关作业的有用信息,包括其当前运行状态。它在生成结果时收集作业结果。
使用ForEach-Object -Parallel -AsJob
PowerShell 7.0 向 ForEach-Object
cmdlet 添加了新的参数集。新参数允许您将脚本块作为 PowerShell 作业在并行线程中运行。
您可以通过管道将数据传输到 ForEach-Object -Parallel
。数据被传递到并行运行的脚本块。 -AsJob
参数为每个并行线程创建作业对象。
以下命令启动一个作业,其中包含通过管道传输到该命令的每个输入值的子作业。每个子作业都运行 Write-Output 命令,并将管道输入值作为参数。
1..5 | ForEach-Object -Parallel { Write-Output $_ } -AsJob
ForEach-Object -Parallel
命令返回一个 PSTaskJob
对象,其中包含每个管道输入值的子作业。作业对象包含有关子作业运行状态的有用信息。它在生成结果时收集子作业的结果。
如何等待作业完成并检索作业结果
您可以使用 PowerShell 作业 cmdlet(例如 Wait-Job
和 Receive-Job
)等待作业完成,然后返回作业生成的所有结果。
以下命令启动一个线程作业,该作业运行 Get-Process 命令,然后等待该命令完成,最后返回该命令生成的所有数据结果。
Start-ThreadJob -ScriptBlock { Get-Process } | Wait-Job | Receive-Job
以下命令启动一个作业,该作业为每个管道输入运行 Write-Output 命令,然后等待所有子作业完成,最后返回子作业生成的所有数据结果。
1..5 | ForEach-Object -Parallel { Write-Output $_ } -AsJob | Wait-Job | Receive-Job
Receive-Job
cmdlet 返回子作业的结果。
1
3
2
4
5
由于每个子作业并行运行,因此无法保证生成结果的顺序。
线程作业性能
线程作业比其他类型的作业更快、更轻。但与工作正在进行的工作相比,他们的开销仍然可能很大。
PowerShell 在会话中运行命令和脚本。会话中一次只能运行一个命令或脚本。因此,当运行多个作业时,每个作业都在单独的会话中运行。每个会话都会产生开销。
当线程作业执行的工作大于用于运行作业的会话的开销时,线程作业可提供最佳性能。有两种情况符合这个标准。
-
工作是计算密集型的 - 在多个线程作业上运行脚本可以利用多个处理器核心并更快地完成。
工作包括大量等待 - 花费时间等待 I/O 或远程调用结果的脚本。并行运行通常比顺序运行完成得更快。
(Measure-Command {
1..1000 | ForEach { Start-ThreadJob { Write-Output "Hello $using:_" } } | Receive-Job -Wait
}).TotalMilliseconds
36860.8226
(Measure-Command {
1..1000 | ForEach-Object { "Hello: $_" }
}).TotalMilliseconds
7.1975
上面的第一个示例显示了一个 foreach 循环,该循环创建 1000 个线程作业来执行简单的字符串写入。由于作业开销,需要超过 36 秒才能完成。
第二个示例运行 ForEach
cmdlet 来执行相同的 1000 次操作。这次,ForEach-Object
在单个线程上按顺序运行,没有任何作业开销。只需 7 毫秒即可完成。
在以下示例中,为 10 个单独的系统日志收集最多 5000 个条目。由于该脚本涉及读取大量日志,因此并行执行这些操作是有意义的。
$logNames.count
10
Measure-Command {
$logs = $logNames | ForEach-Object {
Get-WinEvent -LogName $_ -MaxEvents 5000 2>$null
}
}
TotalMilliseconds : 252398.4321 (4 minutes 12 seconds)
$logs.Count
50000
当作业并行运行时,脚本的完成时间缩短了一半。
Measure-Command {
$logs = $logNames | ForEach {
Start-ThreadJob {
Get-WinEvent -LogName $using:_ -MaxEvents 5000 2>$null
} -ThrottleLimit 10
} | Wait-Job | Receive-Job
}
TotalMilliseconds : 115994.3 (1 minute 56 seconds)
$logs.Count
50000
线程作业和变量
有多种方法可以将值传递到基于线程的作业。
Start-ThreadJob
可以接受通过管道传输到 cmdlet、通过 $using
关键字传递到脚本块或通过 ArgumentList 传递的变量参数。
$msg = "Hello"
$msg | Start-ThreadJob { $input | Write-Output } | Wait-Job | Receive-Job
Start-ThreadJob { Write-Output $using:msg } | Wait-Job | Receive-Job
Start-ThreadJob { param ([string] $message) Write-Output $message } -ArgumentList @($msg) |
Wait-Job | Receive-Job
ForEach-Object -Parallel
接受通过管道传入的变量,以及通过 $using
关键字直接传递到脚本块的变量。
$msg = "Hello"
$msg | ForEach-Object -Parallel { Write-Output $_ } -AsJob | Wait-Job | Receive-Job
1..1 | ForEach-Object -Parallel { Write-Output $using:msg } -AsJob | Wait-Job | Receive-Job
由于线程作业在同一进程中运行,因此必须仔细处理传递到作业中的任何变量引用类型。如果它不是线程安全的对象,则永远不应该对其进行赋值,并且永远不应该在其上调用方法和属性。
以下示例将线程安全的 .NET ConcurrentDictionary
对象传递给所有子作业以收集唯一命名的进程对象。由于它是一个线程安全对象,因此当作业在进程中并发运行时可以安全地使用它。
$threadSafeDictionary = [System.Collections.Concurrent.ConcurrentDictionary[string,object]]::new()
$jobs = Get-Process | ForEach {
Start-ThreadJob {
$proc = $using:_
$dict = $using:threadSafeDictionary
$dict.TryAdd($proc.ProcessName, $proc)
}
}
$jobs | Wait-Job | Receive-Job
$threadSafeDictionary.Count
96
$threadSafeDictionary["pwsh"]
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
112 108.25 124.43 69.75 16272 1 pwsh
参见
- 关于职位详情
- about_Remote_Jobs
- about_Thread_Jobs
- about_PSSessions
- about_Remote
- Get-Job
- Receive-Job
- Remove-Job
- Start-Job
- Stop-Job
- Wait-Job
- 上一篇:[精彩网文] 受人尊敬的人的 14 个经典特征
- 下一篇:[玩转系统] 关于遥测
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag