2012-04-12 7 views
0

2つの関数を並列に実行し、ある関数(リストに連続して格納されている)の戻り値を別の関数で使用したいとします。共通リストと並行して実行する関数

私は上記を達成するためのいくつかの関数を書いています(このフォーラムの以前の記事の助けを借りて)。

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 

私が意図したタスクを達成するのを助けるください。私は、次の

RunP(func_a, func_b) 

のような機能の両方を呼び出すしかし、私はこれを実行すると、私はこのエラーを取得する

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

+0

正しくコードをインデントしてください

はここにあなたのコードに似ていquick'n'dirty例です。今、構文エラーがあります。 – Simon

答えて

4

Queueのように聞こえますか?私はこれを実行すると

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

はい、真です。一方の端は1つの関数で埋め込まれ、もう一方の端はもう一方の端で使用されます。 – Asimananda

+0

素敵でシンプルなソリューションをありがとう。 – Asimananda

+0

私はもう一つ気になります。 func_aのq.put()の中に他の関数の出力を入れる必要がありますが、どうすればいいでしょうか? 関数をq.put()の中に直接入れるか、 "u"という変数に変数を保存してq.put()のようにq.put()に入れてもエラーになります。 トレースバック(直近の最後のコール): ファイル "/usr/lib/python2.4/site-packages/multiprocessing-2.6.2.1-py2.4-linux-i686.egg/multiprocessing/queues.py"、行2425、_feed send(obj) PicklingError:を選択できません>:属性ルックアップ__builtin __。instancemethodが失敗しました – Asimananda

関連する問題