盡解powershell的workflow
-------1【簡介】---------
Microsoft .NET Framework 4.0 發布於2010年4月左右。
.net4 的新特性,是並行多任務機制。.net4 workflow(WF),翻譯為工作流,它依賴並行多任務機制,並成為其延伸。(也有說法說WF在.net3中就有)
基於.net4的workflow,微軟powershell團隊開發出了powershell workflow。並作為powershell3.0的新特性推出,它是對.net4 workflow的封裝,或調用。
powershell workflow中,並行語句產生的,每個並行任務,都會產生一個powershell。exe進程。是並發【多進程】!任務。
它彌補了powershell v2.0原先只有多線程(*-job命令)的不足。
powershell workflow中,並行語句產生的,每個並行任務,都會產生一個powershell。exe進程。是並發【多進程】!任務。
它彌補了powershell v2.0原先只有多線程(*-job命令)的不足。
--------2【淺談多線程,多進程腳本的區別】---------
1 powershell job所有線程,都在一個powershell.exe進程中運行。powershell的多線程,可以使用多cpu核心,這點比python強。
bat,bash中沒有多線程。powershell只有一個前台線程,無數個后台線程。
2 powershell workflow並行語句產生的,每個並行任務,都會產生一個powershell。exe進程。因為有進程創建時間所以比較慢,但並行提升了多任務速度。
3 進程的特色是隔離,從使用公用變量的角度,【多進程】不容易的,是不如【多線程】簡單方便的。任何計算機語言都是這樣。
但有了隔離,腳本代碼跑的會更健壯。壞了就殺掉,不影響其他腳本。
但有了隔離,腳本代碼跑的會更健壯。壞了就殺掉,不影響其他腳本。
4 從程序編寫難易度,【多進程】比代碼【多線程】更容易寫,容易控制。任何計算機語言都是這樣。
powershell 線程 進程 workflow Register-PSSessionConfiguration Set-PSSessionConfiguration
powershell 傳教士 原創文章 允許轉載,但必須保留名字和出處,否則追究法律責任。2014-03-29寫,2019-09-18改,
powershell 傳教士 原創文章 允許轉載,但必須保留名字和出處,否則追究法律責任。2014-03-29寫,2019-09-18改,
5 不論是多進程,還是多線程,只能解決cpu密集計算的問題,只能解決io密集計算的問題。並發只是在用內存空間換時間,任何計算機語言都是這樣。
--------3 【workflow的原理和使用場景】---------
每個powershell.exe啟動要2秒鍾左右,占用內存80---100mb。所以你先要規划好內存。
假如說你有200個任務,並限定200個進程並發。
1workflow會先啟動這200個powershell.exe,也就是400秒內,光吃cpu,內存了,沒運行任務。
2把你的腳本任務,傳給powershell運行。
3任務運行完畢后,這200個powershell.exe,坐等新任務,卻等不到。
4超過一定時間后,這200個powershell.exe,開始被殺掉。
workflow使用場景:
1workflow首次啟動非常慢。
2每個傳入任務至少要10秒左右的,最好30秒以上。若傳入任務用時太小,時間將被耗費在進程切換上。
3如果傳入任務用時很小,還想用workflow,則應每次傳入一組n個任務。
4每個powershell.exe,最少應該接活2次。即限定200個進程並發,則最少應該有400個任務。
--------4 【workflow數據的輸出】---------
1用一段代碼,或一個腳本,來實現,並發寫入txt。本質是多進程,同時寫入txt。這里面必須有一個隨機延時的功能。
分享powershell腳本:同一個txt文件,300個並發寫入
http://bbs.chinaunix.net/thread-4314470-1-1.html
http://bbs.chinaunix.net/thread-4314470-1-1.html
【bf並發寫入txt_v1.1.ps1】,腳本分享地址:
https://pan.baidu.com/s/16deKKe3ZnCg809lffiVZWg
https://pan.baidu.com/s/16deKKe3ZnCg809lffiVZWg
2寫入隊列也可以。本質是多進程,通過端口,sql插件,寫入另一個進程。在那個進程中,數據排隊,再輸出。
3寫入數據庫也可以。本質是用數據庫的鎖,實現並發到順序。
比如,用一個腳本,寫入數據庫。等workflow執行完畢后,在任務腳本最后一行,調用另一個腳本,讀取數據庫,寫入txt。
--------5 【powershell workflow最大進程數設置】---------
系統默認開5個多進程,
cpu密集型任務,應該根據cpu核心設定,比如有16核心,則開15,或16個進程。
io密集型任務,可以開100,200,這樣。
#管理員權限,一次性執行此命令!
Enable-PSRemoting -SkipNetworkProfileCheck -Force Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-NoScope" -RemoteAddress Any Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP" -RemoteAddress Any Set-Item WSMan:\localhost\Client\TrustedHosts -Value '*' $我的工作流參數 = New-PSWorkflowExecutionOption -MaxActivityProcesses 200 Register-PSSessionConfiguration -Name '我的工作流配置' -SessionTypeOption $我的工作流參數 -SessionType Workflow -Force (Get-PSSessionConfiguration -Name '我的工作流配置' ).maxactivityprocesses restart-service -Name WinRM -Force
--------6 【workflow腳本例子】---------
workflow最常用的功能,就是foreach -parallel
$我的workflow代碼 = { workflow bingfa3 { foreach -parallel ($renwu in 1..60) { inlinescript { Start-Sleep -Seconds 1 $using:renwu Start-Sleep -Seconds 60 } } #問:這個腳本誰寫的?有問題找誰技術支持? #答:QQ群號=183173532 #名稱=powershell交流群 # 2019-09-18 轉載留名 } bingfa3 }
$本機ip = '192.168.11.22'
$workflow連接1 = New-PSSession -ComputerName $本機ip -ConfigurationName '我的工作流配置' Invoke-Command -Session $workflow連接1 -ScriptBlock $我的workflow代碼 Remove-PSSession $workflow連接1
--------7 【手冊,資料】---------
powershell工作流 https://docs.microsoft.com/zh-cn/powershell/scripting/components/workflows-guide?view=powershell-5.1
New-PSWorkflowExecutionOption https://docs.microsoft.com/zh-cn/powershell/module/psworkflow/new-psworkflowexecutionoption?view=powershell-5.1
About Workflows https://docs.microsoft.com/zh-cn/powershell/module/psworkflow/about/about_workflows?view=powershell-5.1
About WorkflowCommonParameters https://docs.microsoft.com/zh-cn/powershell/module/psworkflow/about/about_workflowcommonparameters?view=powershell-5.1
