2014-03-27 134 views
7

我试图在python中创建一个程序,该程序同时在不同的处理器上运行多个函数实例(15)。我一直在研究这一点,并使用多处理工具工具设置了下面的程序。Python:同时运行多个进程

不幸的是,程序按顺序执行函数的每个实例(在进入循环的下一部分之前似乎要等待一个完成)。

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() 

我对编程有新意,并没有并行化经验 - 任何帮助将不胜感激。

- 编辑 -

我已经包含上面的整个程序,与实际功能替代“有些功能”,证明这不是一个时间问题。该程序可能需要数天才能遍历所有40,000个文件(每个文件都很大)。

- 另一个编辑 -

它看起来像前几个反应是正确的 - 剧本确实同步推出多个进程。我的问题与我正在使用的集群上的提交系统有关。

谢谢!

回答

1

你确定吗?我刚刚尝试过,它对我有用;结果在每次执行时都是无序的,所以它们被并发执行。

看看你的功能。它需要“第一个”和“最后一个”,对于较低的值,执行时间会更短吗?在这种情况下,您可以期望编号较小的参数使运行时间降低,因此它似乎并行运行。

ps ux | grep python | grep -v grep | wc -l 
> 16 

如果多次执行代码(即使用一个bash脚本),你可以看到,每一个进程正在启动。如果要确认此项,请导入os并将该功能打印出os.getpid(),以便您可以看到它们具有不同的进程ID。

所以是的,仔细检查你的结果,因为在我看来,就像你已经写了它同时很好!

9

我认为正在发生的事情是,您在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