दिलचस्प पोस्ट
एंड्रॉइड अनुमतियां: फोन कॉल: फ़ोन स्थिति और पहचान पढ़ें JQuery टैग नाम प्रदान कर सकता है? जावास्क्रिप्ट में मॉड्यूल के दो घोषणाओं के बीच अंतर क्या है? जावास्क्रिप्ट के साथ एचटीएमएल ईमेल जांचें कि क्या PHP सत्र पहले से शुरू हो चुका है MySQL में एकाधिक स्तंभ विदेशी कुंजी? दो आयामी arrays का प्रतिनिधित्व करने के लिए हम डबल सूचक का उपयोग क्यों नहीं कर सकते? JavaScript या jQuery का उपयोग करके एक नया टैब में यूआरएल कैसे खोल सकता है? सेल में JTable अक्षम चेकबॉक्स कैसे हाइबरनेट HQL परिणामों के साथ प्रकार सुरक्षा चेतावनियों से बचने के लिए? Safari में console.log के डिफ़ॉल्ट व्यवहार को मैं कैसे बदल सकता हूँ? सभी सबव्यूज़ निकालें? क्या कोई C ++ क्लास सदस्य फ़ंक्शन टेम्पलेट आभासी हो सकता है? JTextPane एक नया स्ट्रिंग जोड़ रहा है डी 3 में बल निर्देशित ग्राफ़ के अर्थ ज़ूमिंग

पायथन थ्रेडिंग एकाधिक बैश उपप्रक्रिया?

समानांतर बास प्रक्रियाओं को उत्पन्न करने के लिए कोई थ्रेडिंग और सबप्रोसेस मॉड्यूल का उपयोग कैसे करता है? जब मैं थ्रेड को पहली बार जवाब देता हूं: पायथन में थ्रेडिंग का उपयोग कैसे करें? , बैश प्रक्रिया समानांतर के बजाय क्रमिक रूप से चलती है।

Solutions Collecting From Web of "पायथन थ्रेडिंग एकाधिक बैश उपप्रक्रिया?"

समानांतर में उपप्रक्रिया चलाने के लिए आपको थ्रेड्स की आवश्यकता नहीं है:

from subprocess import Popen commands = [ 'date; ls -l; sleep 1; date', 'date; sleep 5; date', 'date; df -h; sleep 3; date', 'date; hostname; sleep 2; date', 'date; uname -a; date', ] # run in parallel processes = [Popen(cmd, shell=True) for cmd in commands] # do other things here.. # wait for completion for p in processes: p.wait() 

समवर्ती कमांड की संख्या को सीमित करने के लिए आप multiprocessing.dummy.Pool उपयोग कर सकते multiprocessing.dummy.Pool जो थ्रेड्स का उपयोग करता है और एक ही इंटरफ़ेस को multiprocessing.Pool रूप में प्रदान करता multiprocessing.Pool जो प्रक्रियाओं का उपयोग करता है:

 from functools import partial from multiprocessing.dummy import Pool from subprocess import call pool = Pool(2) # two concurrent commands at a time for i, returncode in enumerate(pool.imap(partial(call, shell=True), commands)): if returncode != 0: print("%d command failed: %d" % (i, returncode)) 

यह जवाब समवर्ती उपप्रक्रियाओं की संख्या को सीमित करने के लिए विभिन्न तकनीकों को दर्शाता है : यह बहुप्रोसेसिंग दिखाता है। पोल, समवर्ती.फ्यूचर, थ्रेडिंग + कतार-आधारित समाधान


आप थ्रेड / प्रोसेस पूल का उपयोग किए बिना समवर्ती बाल प्रक्रियाओं की संख्या को सीमित कर सकते हैं:

 from subprocess import Popen from itertools import islice max_workers = 2 # no more than 2 concurrent processes processes = (Popen(cmd, shell=True) for cmd in commands) running_processes = list(islice(processes, max_workers)) # start new processes while running_processes: for i, process in enumerate(running_processes): if process.poll() is not None: # the process has finished running_processes[i] = next(processes, None) # start new process if running_processes[i] is None: # no new processes del running_processes[i] break 

यूनिक्स पर, आप व्यस्त लूप से बच सकते हैं और os.waitpid(-1, 0) पर ब्लॉक कर सकते हैं , ताकि बाहर निकलने के लिए किसी भी बाल प्रक्रिया की प्रतीक्षा कर सकें।

एक साधारण थ्रेडिंग उदाहरण:

 import threading import Queue import commands import time # thread class to run a command class ExampleThread(threading.Thread): def __init__(self, cmd, queue): threading.Thread.__init__(self) self.cmd = cmd self.queue = queue def run(self): # execute the command, queue the result (status, output) = commands.getstatusoutput(self.cmd) self.queue.put((self.cmd, output, status)) # queue where results are placed result_queue = Queue.Queue() # define the commands to be run in parallel, run them cmds = ['date; ls -l; sleep 1; date', 'date; sleep 5; date', 'date; df -h; sleep 3; date', 'date; hostname; sleep 2; date', 'date; uname -a; date', ] for cmd in cmds: thread = ExampleThread(cmd, result_queue) thread.start() # print results as we get them while threading.active_count() > 1 or not result_queue.empty(): while not result_queue.empty(): (cmd, output, status) = result_queue.get() print('%s:' % cmd) print(output) print('='*60) time.sleep(1) 

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

ऐसा इसलिए है क्योंकि यह करना चाहिए था, जो बात आप करना चाहते हैं वह बहुभुजितक नहीं है, लेकिन यह स्टैक पृष्ठ देखें