我有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脚本),不存在吗?
答案 0 :(得分:10)
您正在寻找multiprocessing包,尤其是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 &
等方法更好。如果某些进程比其他进程花费的时间更长(因此,python run.py 0 200000
可能先完成其他进程),这将确保所有5个线程继续工作,直到所有线程完成。
请注意,根据您计算机的体系结构,同时运行太多进程可能会降低所有进程的速度(对于初学者来说,这取决于您的处理器有多少核心,以及您同时运行的其他内容) )。
答案 1 :(得分:0)
你可以让你的python程序创建独立的进程,而不是bash做它,但这并没有太大的不同。您发现缺陷的解决方案是什么?