আপডেট - যদিও এই উত্তরটি পাওয়ার শেল রানস্পেসগুলির প্রক্রিয়া এবং যান্ত্রিকতার ব্যাখ্যা দেয় এবং তারা কীভাবে আপনাকে বহু-থ্রেড নন-সিক্যুয়ালি ওয়ার্কলোডগুলি সহায়তা করতে পারে, সহযোগী পাওয়ারশেল আফিসিয়ানাডো ওয়ারেন 'কুকি মনস্টার' এফ অতিরিক্ত মাইল চলে গেছে এবং এই একই ধারণাগুলিকে একটি একক সরঞ্জামে অন্তর্ভুক্ত করেছে বলা হয় - এটি আমি নীচে যা বর্ণনা করি তা করে এবং এটি তখন থেকে লগিংয়ের জন্য alচ্ছিক সুইচগুলি এবং আমদানি করা মডিউলগুলি সহ সত্যই শীতল স্টাফ সহ প্রস্তুত সেশন স্টেট সহ এটি প্রসারিত করে দেয় - আমি দৃ I়ভাবে আপনাকে চকচকে সমাধানের মালিকানা তৈরি করার আগে এটি পরীক্ষা করে দেখার পরামর্শ দিচ্ছি !Invoke-Parallel
সমান্তরাল রানস্পেস এক্সিকিউশন সহ:
অপরিহার্য অপেক্ষার সময় হ্রাস করা
মূল নির্দিষ্ট ক্ষেত্রে, এক্সিকিউটেবল ইনভয়েটেডের একটি /nowait
বিকল্প রয়েছে যা চাকরীটি (এই ক্ষেত্রে, সময় পুনরায় সমলয়করণ) এর নিজস্ব হয়ে গেলে শেষ হওয়া থ্রেডটি ব্লক করা বাধা দেয়।
এটি ইস্যুকারীদের দৃষ্টিকোণ থেকে সামগ্রিক কার্যকর সময়কে হ্রাস করে, তবে প্রতিটি মেশিনের সাথে সংযোগ এখনও ক্রমবর্ধমান ক্রমে সম্পন্ন হয়। ক্রম সহ কয়েক হাজার ক্লায়েন্টের সাথে সংযোগ স্থাপনের সময়সীমা অপেক্ষা অপেক্ষা জমা হওয়ার কারণে এক কারণে বা অপ্রয়োজনীয় অন্য কোনও মেশিনের সংখ্যার উপর নির্ভর করে দীর্ঘ সময় নিতে পারে।
একক বা একটানা কয়েক সময়সীমার ক্ষেত্রে পরবর্তী সমস্ত সংযোগগুলি সারি করার জন্য, আমরা সমান্তরালভাবে এক্সিকিউট করে পাওয়ারশেল রানস্পেসগুলি পৃথক করার জন্য কমান্ডগুলি সংযুক্ত করার ও অনুরোধ করার কাজটি প্রেরণ করতে পারি।
রানস্পেস কী?
একটি রানস্পেস হ'ল ভার্চুয়াল ধারক যেখানে আপনার পাওয়ারশেল কোডটি চালিত করে এবং একটি পাওয়ারশেল স্টেটমেন্ট / কমান্ডের দৃষ্টিকোণ থেকে পরিবেশকে প্রতিনিধিত্ব করে / ধরে রাখে।
বিস্তৃত ভাষায়, 1 রানস্পেস = এক্সিকিউশনের 1 থ্রেড, সুতরাং আমাদের পাওয়ারশেল স্ক্রিপ্টটি "স্পেসিফিকেশন" মাল্টি থ্রেড করা দরকার যা স্পেসসেসের সংগ্রহ যা পরবর্তীতে সমান্তরালে কার্যকর করতে পারে।
আসল সমস্যার মতো, একাধিক রানস্পেসে কমান্ড কমান্ডের কাজটি এখানে বিভক্ত হতে পারে:
- একটি রানস্পেসপুল তৈরি করা হচ্ছে
- একটি পাওয়ারশেল স্ক্রিপ্ট বা রানস্পেসপুলে এক্সিকিউটেবল কোডের সমতুল্য টুকরো বরাদ্দ করা হচ্ছে
- কোডটি তাত্পর্যপূর্ণভাবে চাওয়া (যেমন কোডটি ফেরার জন্য অপেক্ষা করতে হবে না)
রানস্পেসপুল টেম্পলেট
পাওয়ারশেলের একটি টাইপ এক্সিলারেটর রয়েছে যা [RunspaceFactory]
রানস্পেস উপাদান তৈরিতে আমাদের সহায়তা করবে - আসুন এটি কাজ করতে দিন
1. একটি রানস্পেসপুল তৈরি করুন এবং Open()
এটি:
$RunspacePool = [runspacefactory]::CreateRunspacePool(1,8)
$RunspacePool.Open()
দুটি আর্গুমেন্ট পাস CreateRunspacePool()
, 1
এবং 8
হয় সর্বনিম্ন এবং যেকোনো দেওয়া সময়ে চালানো করার অনুমতি দেওয়া runspaces সর্বোচ্চ সংখ্যক, আমাদের একটি কার্যকর দান সর্বাধিক সাদৃশ্য ডিগ্রী 8।
২. পাওয়ারশেলের একটি উদাহরণ তৈরি করুন, এর সাথে কিছু এক্সিকিউটেবল কোড সংযুক্ত করুন এবং এটি আমাদের রানস্পেসপুলে বরাদ্দ করুন:
পাওয়ারশেলের একটি উদাহরণ powershell.exe
প্রক্রিয়াটির মতো নয় (যা সত্যই একটি হোস্ট অ্যাপ্লিকেশন), তবে চালিত করার জন্য পাওয়ারশেল কোডকে উপস্থাপন করে এমন একটি অভ্যন্তরীণ রানটাইম অবজেক্ট। [powershell]
পাওয়ারশেলের মধ্যে নতুন পাওয়ারশেল উদাহরণ তৈরি করতে আমরা টাইপ এক্সিলারেটরটি ব্যবহার করতে পারি :
$Code = {
param($Credentials,$ComputerName)
$session = New-PSSession -ComputerName $ComputerName -Credential $Credentials
Invoke-Command -Session $session -ScriptBlock {w32tm /resync /nowait /rediscover}
}
$PSinstance = [powershell]::Create().AddScript($Code).AddArgument($creds).AddArgument("computer1.domain.tld")
$PSinstance.RunspacePool = $RunspacePool
৩. এপিএম ব্যবহার করে পাওয়ারশেল উদাহরণটি অবিচ্ছিন্নভাবে আহ্বান করুন:
.NET বিকাশের পরিভাষায় অ্যাসিনক্রোনাস প্রোগ্রামিং মডেল হিসাবে পরিচিত যা ব্যবহার করে , আমরা Begin
কোডটি কার্যকর করার জন্য "সবুজ আলো" দেওয়ার জন্য, End
ফলাফল সংগ্রহের জন্য একটি পদ্ধতিতে একটি কমান্ডের অনুরোধকে একটি পদ্ধতিতে বিভক্ত করতে পারি । যেহেতু আমরা এই ক্ষেত্রে কোনও প্রতিক্রিয়ায় সত্যই আগ্রহী নই (আমরা w32tm
যাইহোক আউটপুটটির জন্য অপেক্ষা করি না ), তাই আমরা প্রথম পদ্ধতিটিতে কেবল কল করেই উপযুক্ত করতে পারি
$PSinstance.BeginInvoke()
এটি রানস্পেসপুলে জড়িয়ে রাখছে
উপরের কৌশলটি ব্যবহার করে, আমরা নতুন সংযোগ তৈরি করার এবং ক্রমবর্ধমান ক্রম প্রবাহে রিমোট কমান্ডের অনুরোধের ক্রমিক ক্রিয়াকলাপগুলি মোড়তে পারি:
$ComputerNames = Get-ADComputer -filter * -Properties dnsHostName |select -Expand dnsHostName
$Code = {
param($Credentials,$ComputerName)
$session = New-PSSession -ComputerName $ComputerName -Credential $Credentials
Invoke-Command -Session $session -ScriptBlock {w32tm /resync /nowait /rediscover}
}
$creds = Get-Credential domain\user
$rsPool = [runspacefactory]::CreateRunspacePool(1,8)
$rsPool.Open()
foreach($ComputerName in $ComputerNames)
{
$PSinstance = [powershell]::Create().AddScript($Code).AddArgument($creds).AddArgument($ComputerName)
$PSinstance.RunspacePool = $rsPool
$PSinstance.BeginInvoke()
}
ধরে নিই যে সিপিইউতে একবারে সমস্ত 8 রান স্পেস চালানোর ক্ষমতা রয়েছে, আমাদের দেখতে হবে যে কার্যকর করার সময়টি অনেক হ্রাস পেয়েছে, তবে পরিবর্তিত "উন্নত" পদ্ধতির কারণে স্ক্রিপ্টটির পঠনযোগ্যতা ব্যয় করে।
প্যারালিজমের সর্বোত্তম ডিগ্রী নির্ধারণ করা:
আমরা সহজেই একটি রানস্পেসপুল তৈরি করতে পারতাম যা একই সাথে 100 রান স্পেস চালানোর অনুমতি দেয়:
[runspacefactory]::CreateRunspacePool(1,100)
তবে দিনের শেষে, এটি সমস্তই নেমে আসে যে আমাদের স্থানীয় সিপিইউ কার্যকর করার কত ইউনিট পরিচালনা করতে পারে। অন্য কথায়, যতক্ষণ না আপনার কোডটি কার্যকর হচ্ছে, আপনার কাছে লজিকাল প্রসেসরগুলির চেয়ে কোড চালানো প্রেরণকারীদের চেয়ে বেশি রান স্পেসের অনুমতি দেওয়ার কোনও অর্থ হবে না।
ডাব্লুএমআইকে ধন্যবাদ, এই প্রান্তিকতা নির্ধারণ করা মোটামুটি সহজ:
$NumberOfLogicalProcessor = (Get-WmiObject Win32_Processor).NumberOfLogicalProcessors
[runspacefactory]::CreateRunspacePool(1,$NumberOfLogicalProcessors)
অন্যদিকে, যদি আপনি যে কোডটি নিজেই চালাচ্ছেন তার মধ্যে নেটওয়ার্কের বিলম্বের মতো বাহ্যিক কারণগুলির কারণে প্রচুর অপেক্ষা করার সময় আসে তবে আপনি লজিকাল প্রসেসরের চেয়ে বেশি যুগপত রানস্পেস চালানো থেকে উপকৃত হতে পারেন, তাই আপনি সম্ভবত পরীক্ষা করতে চান বিরতি-এমনকি সন্ধানের জন্য সর্বাধিক রানস্পেসের পরিসীমাটি :
foreach($n in ($NumberOfLogicalProcessors..($NumberOfLogicalProcessors*3)))
{
Write-Host "$n: " -NoNewLine
(Measure-Command {
$Computers = Get-ADComputer -filter * -Properties dnsHostName |select -Expand dnsHostName -First 100
...
[runspacefactory]::CreateRunspacePool(1,$n)
...
}).TotalSeconds
}