я хотел спросить, как я могу использовать subprocess.popen для одновременного выполнения нескольких программ в python, если имена исполняемой программы хранятся в списке. я просто не могу придумать, как мы можем это сделать
нормальные программы python без каких-либо аргументов. Я пытался использовать цикл for, но он выполняется последовательно
Вы можете использовать multithreading
для создания потоков, а затем запускать подпроцессы в каждом потоке. Зачем запускать программы на Python, используя popen
? Почему бы просто не импортировать их и не использовать как любой другой код?
я действительно хотел попытаться создать несколько контейнеров докеров одновременно, используя его. @Carcigenicate, не могли бы вы объяснить, что вы подразумеваете под использованием многопоточности через код, если это возможно?
Трудно дать конкретный ответ, так как неясно, что именно вы хотите запустить (а у меня нет большого опыта работы с докером). Вот пример запуска нескольких ping
одновременно, который должен проиллюстрировать, как это можно сделать:
from subprocess import Popen
from multiprocessing.pool import ThreadPool
programs = ["ping 192.168.50.111", "ping 192.168.50.102"]
def run_program(prog_string):
return Popen(prog_string.split())
# A bit of an abuse of ThreadPool, but it makes cleaning up the threads easier.
with ThreadPool(len(programs)) as pool:
popens = pool.map(run_program, programs)
В моей сети это печатает:
Pinging 192.168.50.111 with 32 bytes of data:
Pinging 192.168.50.102 with 32 bytes of data:
Reply from 192.168.50.102: bytes=32 time=21ms TTL=64
Reply from 192.168.50.111: bytes=32 time=342ms TTL=64
Reply from 192.168.50.102: bytes=32 time=3ms TTL=64
Reply from 192.168.50.111: bytes=32 time=991ms TTL=64
Reply from 192.168.50.111: bytes=32 time=5ms TTL=64
Reply from 192.168.50.102: bytes=32 time=2ms TTL=64
Reply from 192.168.50.102: bytes=32 time=2ms TTL=64
Ping statistics for 192.168.50.102:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 2ms, Maximum = 21ms, Average = 7ms
Reply from 192.168.50.111: bytes=32 time=812ms TTL=64
Ping statistics for 192.168.50.111:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 5ms, Maximum = 991ms, Average = 537ms
Как видите, оба были запущены примерно в одно и то же время и работают одновременно.
ThreadPool
создает пул потоков и запускается run_program
внутри потоков. «Программные строки» programs
передаются этой функции по отдельности, затем возвращается результирующий Popen
, и все они вместе помещаются в popens
.
Если вам действительно не нужно Popen
, вы можете обнаружить, что run проще в использовании.
Какие программы? Нужно ли выполнять программы с аргументами? А что вы пробовали? В чем конкретно вам нужна помощь?