Запуск нескольких программ 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, но это не сильно отличается. Что в вашем решении кажется вам недостаточным?