बैच कमांड के लिए मल्टीथ्रेडेड विंडोज


11

आप को चलाने के लिए एक आसान तरीका है तो पता है के लिए एक से अधिक थ्रेड पर बैच फ़ाइल में आदेश? अगर मैं 4 समानांतर धागे में अपने कार्यों को नहीं चला सकता तो 4 कोर होने की क्या बात है?

उदाहरण के लिए, यदि मैं PNGOUT के साथ PNG को अनुकूलित कर रहा हूं, तो मैं जिस कमांड का उपयोग करूंगा

for %i in (*.png) do pngout "%i"

लेकिन यह अत्यधिक पैरलिसेबल कार्य है जिसमें उप-कार्य एक दूसरे पर बिल्कुल भी निर्भर नहीं करते हैं।

इसे 4 'कतारों' में चलाने के लिए मैं कुछ लिखूंगा

for -thread 4 %i in (*.png) do pngout "%i"

क्या मुझे अपना स्वयं का ऐप लिखने की ज़रूरत है जो ऐसा करने में सक्षम होगा या क्या कोई निशुल्क समाधान उपलब्ध है?


बाहरी उपकरण का उपयोग करने के लिए फोलोइंग उत्तर की जाँच करें: [ stackoverflow.com/a/12041213/365229
हमने ई

जवाबों:


13

मैंने एक बैच फ़ाइल लिखी है जो स्टैक ओवरफ्लो पर कुछ समय पहले केवल अधिकतम कमांड को निष्पादित करता है : शेल प्रक्रियाओं का समानांतर निष्पादन :

@echo off
for /l %%i in (1,1,20) do call :loop %%i
goto :eof

:loop
call :checkinstances
if %INSTANCES% LSS 5 (
    rem just a dummy program that waits instead of doing useful stuff
    rem but suffices for now
    echo Starting processing instance for %1
    start /min wait.exe 5 sec
    goto :eof
)
rem wait a second, can be adjusted with -w (-n 2 because the first ping returns immediately;
rem otherwise just use an address that's unused and -n 1)
echo Waiting for instances to close ...
ping -n 2 ::1 >nul 2>&1
rem jump back to see whether we can spawn a new process now
goto loop
goto :eof

:checkinstances
rem this could probably be done better. But INSTANCES should contain the number of running instances afterwards.
for /f "usebackq" %%t in (`tasklist /fo csv /fi "imagename eq wait.exe"^|find /v /c ""`) do set INSTANCES=%%t
goto :eof

यह अधिकतम चार नई प्रक्रियाओं को जन्म देता है जो समानांतर और न्यूनतम में निष्पादित होती हैं। प्रतीक्षा समय को संभवतः समायोजित करने की आवश्यकता है, यह इस बात पर निर्भर करता है कि प्रत्येक प्रक्रिया कितनी चलती है और कितनी देर तक चलती है। आपको संभवतः उस प्रक्रिया के नाम को समायोजित करने की आवश्यकता है जिसके लिए कार्यसूची देख रही है यदि आप कुछ और कर रहे हैं।

हालांकि, इस बैच द्वारा प्रायोजित प्रक्रियाओं को ठीक से गिनने का कोई तरीका नहीं है। एक तरीका बैच की शुरुआत में एक यादृच्छिक संख्या बनाना होगा ( %RANDOM%) और एक सहायक बैच बनाना होगा जो प्रसंस्करण करता है (या प्रसंस्करण कार्यक्रम को जन्म देता है) लेकिन जो अपना विंडो शीर्षक एक पैरामीटर पर सेट कर सकता है:

@echo off
title %1
"%2" "%3"

यह एक साधारण बैच होगा जो अपना शीर्षक पहले पैरामीटर पर सेट करता है और फिर तर्क के रूप में तीसरे के साथ दूसरा पैरामीटर चलाता है। फिर आप निर्दिष्ट विंडो शीर्षक ( tasklist /fi "windowtitle eq ...") के साथ केवल प्रक्रियाओं का चयन करके कार्यसूची में फ़िल्टर कर सकते हैं । यह काफी विश्वसनीय काम करना चाहिए और बहुत सारी झूठी सकारात्मकता को रोकता है। खोज cmd.exeकरना एक बुरा विचार होगा यदि आपके पास अभी भी कुछ उदाहरण चल रहे हैं, जैसा कि आपके कार्यकर्ता प्रक्रियाओं के पूल को सीमित करता है।

आप %NUMBER_OF_PROCESSORS%कितने समय तक स्पॉन करने के लिए एक समझदार डिफ़ॉल्ट बनाने के लिए उपयोग कर सकते हैं।

आप psexecदूरस्थ रूप से प्रक्रियाओं को स्पॉन करने के लिए उपयोग करने के लिए इसे आसानी से अनुकूलित कर सकते हैं (लेकिन बहुत व्यवहार्य नहीं होगा क्योंकि आपके पास अन्य मशीन पर व्यवस्थापक विशेषाधिकारों के साथ-साथ बैच में पासवर्ड प्रदान करने के लिए भी है)। आपको फ़िल्टरिंग के लिए प्रक्रिया नामों का उपयोग करना होगा, हालाँकि।


यह कुछ गंभीर काले बैच का जादू है! काश मैं और अधिक बार उत्थान कर पाता!
ऐक्सैरिडैक्स

नहीं, यह काफी बुनियादी सामान है एक बार जब आप इसे लटका लेते हैं ;-)
जॉय

कमांड 'wc' मेरे Win10 कमांड लाइन में उपलब्ध नहीं है। मैं और क्या उपयोग कर सकता हूं?
पीटरको

1
@PeterCo: find /c /v ""
जॉय

1

बैच फाइलें अत्यंत बुनियादी पटकथा के लिए हैं और किसी भी प्रकार के मल्टीथ्रेडिंग का समर्थन नहीं करती हैं। आप जो हासिल करना चाहते हैं, उसे करने के लिए आपको अपनी उपयोगिता लिखनी होगी।

वैकल्पिक रूप से, Windows PowerShell आपको अपने लक्ष्य के करीब लाने के लिए अधिक क्षमता प्रदान कर सकता है।

यदि आप एक ही समय में कई ऑपरेशन चलाना चाहते हैं, तो आप PNGOUT उपयोगिता को एक नई विंडो में लॉन्च करने के लिए कमांड स्टार्ट का उपयोग कर सकते हैं। फ़ॉर लूप फिर प्रत्येक ऑपरेशन के खत्म होने का इंतजार किए बिना जारी रहेगा।

संशोधित रेखा इस तरह दिखाई देगी:

for %i in (*.png) do start pngout "%i"

हालांकि, ध्यान दें कि यह एक ही समय में निर्देशिका में सभी फ़ाइलों के लिए प्रभावी रूप से PNGOUT लॉन्च करेगा , जो सबसे अधिक संभावना नहीं है।


यह एक अनुभवहीन दृष्टिकोण है और जैसा कि आप उल्लेख करते हैं कि शायद यह वांछनीय नहीं है। आप केवल उतनी प्रक्रियाएँ लॉन्च करना चाहते हैं जितनी आपके पास कोर हैं। यदि आपके पास 4 कोर और 1,000 फाइलें हैं, तो आप वास्तव में एक समय में केवल 4 को संसाधित करना चाहते हैं जब तक कि सभी 1,000 संसाधित नहीं हो जाते। यदि आप 4 कोर पर एक बार में सभी 1,000 को संसाधित करने का प्रयास करते हैं, तो आपका कंप्यूटर बेकार क्रॉल में धीमा हो जाएगा।
अदिसक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.