同时运行多个Python程序

6
我有一个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脚本),对吗?

2个回答

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
如果您不使用p.map()返回的值,那么可以使用for _ in p.imap_unordered(do, range(start_i, end_i)): pass - jfs

0

你可以让你的Python程序创建独立的进程,而不是使用bash来完成,但这并没有太大的区别。你认为你的解决方案有什么不足之处?


我想只有一个Python脚本。 - imkost
@imkost: 你不能执行 python run.py 0 1000000 吗? - Joel Cornett
@JoelCornett:这个脚本完成起来太耗费时间了。 - imkost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接