2014-03-27 136 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