Запуск нескольких программ python одновременно

у меня есть скрипт python run.py:

def do(i):
    # doing something with i, that takes time

start_i = sys.argv[1]
end_i = sys.argv[2]
for i in range(start_i, end_i):
    do(i)

затем я запускаю этот скрипт:

python run.py 0 1000000

через 30 минут скрипт будет завершен. Но для меня это слишком долго.

Итак, я создаю скрипт bash run.sh:

python run.py 0 200000 &
python run.py 200000 400000 &
python run.py 400000 600000 &
python run.py 600000 800000 &
python run.py 800000 1000000

затем я запускаю этот скрипт:

bash run.sh

через 6 минут скрипт будет завершен. Довольно хороший. Я счастлив.

но я думаю, есть другой способ решить проблему (без создания bash script), не так ли?

2 ответов


Вы ищите многопроцессорность пакета, и особенно Pool класс:

from multiprocessing import Pool
p = Pool(5)  # like in your example, running five separate processes
p.map(do, range(start_i, end_i))

кроме закреплением этого в одну команду, это имеет другие преимущества перед вашим подходом вызова python run.py 0 200000 & etc. Если некоторые процессы занимают больше времени, чем другие (и, следовательно, python run.py 0 200000 может закончиться раньше других), это позволит убедиться, что все 5 потоков продолжают работать, пока все они не будут сделаны.

обратите внимание, что в зависимости от вашего компьютера архитектура, выполняющая слишком много процессов одновременно, может замедлить их все (для начала это зависит от того, сколько ядер у вашего процессора, а также от того, что еще вы используете одновременно).


У вас может быть программа python для создания независимых процессов, а не bash, но это не сильно отличается. Что в вашем решении кажется вам недостаточным?