我正在尝试在python中创建一个程序,该程序在不同的处理器上同时运行多个函数实例(15)。我一直在研究这个,并使用多处理过程工具设置以下程序。
不幸的是,程序按顺序执行函数的每个实例(它似乎等到一个完成后再转到循环的下一部分)。
from __future__ import print_function
from multiprocessing import Process
import sys
import os
import re
for i in range(1,16):
exec("path%d = 0" % (i))
exec("file%d = open('%d-path','a', 1)" % (i, i))
def stat(first, last):
for j in range(1,40000):
input_string = "water" + str(j) + ".xyz.geocard"
if os.path.exists('./%s' % input_string) == True:
exec("out%d = open('output%d', 'a', 1)" % (first, first))
exec('print("Processing file %s...", file=out%d)' % (input_string, first))
with open('./%s' % input_string,'r') as file:
for line in file:
for i in range(first,last):
search_string = " " + str(i) + " path:"
for result in re.finditer(r'%s' % search_string, line):
exec("path%d += 1" % i)
for i in range(first,last):
exec("print(path%d, file=file%d)" % (i, i))
processes = []
for m in range(1,16):
n = m + 1
p = Process(target=stat, args=(m, n))
p.start()
processes.append(p)
for p in processes:
p.join()
我对编程很新,并且没有并行化方面的经验 - 非常感谢任何帮助。
我已将上述整个程序包含在内,将“Some Function”替换为实际功能,以证明这不是时间问题。该程序可能需要数天才能遍历所有40,000个文件(每个文件都非常大)。
答案 0 :(得分:13)
我认为正在发生的事情是你在some_function中做得不够,无法观察并行发生的工作。它产生一个进程,它在下一个进程生成之前完成。如果您将随机休眠时间引入some_function
,您会发现它们实际上并行运行。
from multiprocessing import Process
import random
import time
def some_function(first, last):
time.sleep(random.randint(1, 3))
print first, last
processes = []
for m in range(1,16):
n = m + 1
p = Process(target=some_function, args=(m, n))
p.start()
processes.append(p)
for p in processes:
p.join()
<强>输出强>
2 3
3 4
5 6
12 13
13 14
14 15
15 16
1 2
4 5
6 7
9 10
8 9
7 8
11 12
10 11
答案 1 :(得分:1)
看看你的功能。它需要&#34;首先&#34;并且&#34;最后&#34;,对于较低的值,它的执行时间是否较小?在这种情况下,您可以期望较小编号的参数使运行时更低,因此它似乎并行运行。
ps ux | grep python | grep -v grep | wc -l
> 16
如果重复执行代码(即使用bash脚本),您可以看到每个进程都在启动。如果您想确认这一点,请导入os
并打开os.getpid()
功能,以便您可以看到他们有不同的进程ID。
所以是的,请仔细检查你的结果,因为在我看来,你似乎已经同时写好了!