Python нарезает несколько подпроцессов bash?

Как использовать потоковые и подпроцессные модули для создания параллельных процессов bash? Когда я запускаю темы ala, первый ответ здесь: Как использовать потоки в Python? , процессы bash выполняются последовательно, а не параллельно.

3 Solutions collect form web for “Python нарезает несколько подпроцессов bash?”

Вам не нужны потоки для параллельной работы подпроцессов:

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.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)) 

Этот ответ демонстрирует различные методы для ограничения количества параллельных подпроцессов : он показывает многопроцессорность. Пул, concurrent.futures, threading + решения на основе очереди.


Вы можете ограничить количество параллельных дочерних процессов без использования пула потоков / процессов:

 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 

В Unix вы можете избежать цикла занятости и заблокировать os.waitpid(-1, 0) , чтобы дождаться 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) 

Обратите внимание, что есть несколько способов сделать это, но это не слишком сложно. В примере используется один поток для каждой команды. Сложность начинает закрадываться, когда вы хотите делать что-то вроде ограниченного количества потоков для обработки неизвестного количества команд. Эти более продвинутые методы не кажутся слишком сложными, как только вы поймете основы потоков. И многопроцессорность становится проще, если у вас есть дескриптор этих методов.

это потому, что он должен делать, то, что вы хотите сделать, это не многопоточность, а многопроцессорность, см. эту страницу стека

  • как получить нормальное выполнение инструкции печати при использовании stdout = subprocess.PIPE во время вызова подпроцесса в python
  • Как я могу узнать, почему subprocess.Popen wait () ждет навсегда, если stdout = PIPE?
  • таймаут подпроцесса
  • Имея трудности с захватом вывода подпроцесса, который обновляет статус на месте
  • Python: Как перенаправить этот вывод?
  • Сохранение stdout из подпроцесса.
  • Когда я пишу скрипт python для запуска Devenv с настройкой «Debug | Win32», он ничего не делает
  • Можете ли вы сделать вывод подпроцесса python stdout и stderr, как обычно, но также захватить вывод в виде строки?
  • Python - лучший язык программирования в мире.