Python:同时运行多个进程

时间:2014-03-27 22:02:50

标签: python

我正在尝试在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个文件(每个文件都非常大)。

2 个答案:

答案 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。

所以是的,请仔细检查你的结果,因为在我看来,你似乎已经同时写好了!