2012-04-12 17 views
0

我想並行運行2個函數,並使用一個函數的返回值(它被連續存儲在一個列表中)在另一個函數中使用。功能要與通用列表並行運行

我已經寫了一些功能來實現上述(從這個論壇上的一些以前的帖子獲得幫助)。

u=[] 

def func_a(): 
Num1=10000 
for i1 in range(callNum1): 
    ul = <some_function_returns_a_value> 
    u.append(ul) 

def func_b(): 
Num2=10000 
time.sleep(30) 
for i2 in range(Num2): 
    ul1=u.pop(i2) 
    print ul1 

def RunP(*fns): 
    proc = [] 
    for fn in fns: 
     p = Process(target=fn) 
     p.start() 
     proc.append(p) 
    for p in proc: 
     p.join() 

我通話雙方的功能,如下面

RunP(func_a, func_b) 

但是當我運行它,我得到這個錯誤:

RunP(func_a, func_b) 
Process Process-2: 
Traceback (most recent call last): 
    File "/usr/lib/python2.4/site-packages/multiprocessing-2.6.2.1-py2.4-linux-i686.egg/multiprocessing/process.py", line 237, in _bootstrap 
    self.run() 
    File "/usr/lib/python2.4/site-packages/multiprocessing-2.6.2.1-py2.4-linux-i686.egg/multiprocessing/process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
    File "test.py", line 419, in func_b 
    ul1=u.pop(i2) 
IndexError: pop from empty list 

請幫我實現了預定的任務。

+0

請正確縮進代碼。現在有語法錯誤 – Simon 2012-04-12 08:21:55

回答

4

聽起來像要使用Queue

這裏有一個quick'n'dirty例子有些類似代碼:

import multiprocessing 

def func_a(q): 
    q.put(3) 
    q.put(2) 
    q.put(1) 

def func_b(q): 
    v = q.get() 
    print 'func_b prints:', v 
    v = q.get() 
    print 'func_b prints:', v 
    v = q.get() 
    print 'func_b prints:', v 

if __name__ == '__main__': 
    q = multiprocessing.Queue() 
    p1 = multiprocessing.Process(target = func_a, args = (q,)) 
    p1.start() 
    p2 = multiprocessing.Process(target = func_b, args = (q,)) 
    p2.start() 
    p1.join() 
    p2.join() 

當我運行它,它打印:

func_b prints: 3 
func_b prints: 2 
func_b prints: 1 
+0

是的,種類是真的。一端將由一個功能填充,另一端將由另一端使用... – Asimananda 2012-04-12 08:27:37

+0

感謝您的好和簡單的解決方案。 – Asimananda 2012-04-12 12:00:52

+0

雖然我還有一個擔憂。如果在func_a中,在q.put()中,我需要把其他函數的輸出,我該怎麼做呢? 如果我把函數直接放在q.put()中,或者即使我將它保存在名爲「u」的變量中,並將其放在q.put()中,如q.put(u),它也會引發錯誤。 回溯(最近一次調用最後一次): 文件「/usr/lib/python2.4/site-packages/multiprocessing-2.6.2.1-py2.4-linux-i686.egg/multiprocessing/queues.py」,行242,in _feed send(obj) PicklingError:不能pickle :屬性查找__builtin __。instancemethod失敗 – Asimananda 2012-04-12 13:24:56