2016-10-11 13 views
1

私はmultiprocessingに関するこのpythonのドキュメントを読んでいます。2つのマッパー関数を並列実行するには?

しかし、私は次のような要件を持っていた:

from multiprocessing import Pool 
import time 

def f(x): 
    print(x) 
    time.sleep(100000000000000); 
    return x*x 

def f2(x): 
    print('**' + str(x) + '**') 
    time.sleep(100000000000000); 
    return x*x*x; 
if __name__ == '__main__': 
    p = Pool(5) 
    print(p.map(f, [1, 2, 3])) 
    print(p.map(f2,[1,2,3])) 

私は、関数fは、私が使用私の場合、それはRabbitMQのキューに耳を傾け、それを阻止しなければならない(ブロックされたユースケースを持っています。長時間の遅延 - 100000000000000は無限時間ブロックを意味します)。 私はここでtime.delayでブロックをシミュレートしています。

が必要ですが、f2(fとは異なります)を起動して並列実行する必要があります。現時点では、f自体がブロックするので、f2にも向かない。

fとf2が両方ともブロックされているにもかかわらず、fとf2を並行して開始する方法に関するガイダンスをいくつか教えてください。

更新:

私は道を見つけたが、それでもRES1を再割り当てした後、それが動作し、それもF呼び出す方法

from multiprocessing import Pool 
import time 

def f(x): 
    print(x) 
    time.sleep(100000000000000); 
    return x*x 

def f2(x): 
    print('**' + str(x) + '**') 
    time.sleep(100000000000000); 
    return x*x*x; 

if __name__ == '__main__': 
    p = Pool(5) 
    res = p.apply_async(f, [2]) 
    res = p.apply_async(f2,[4]) 
    res.get() 

を困惑ように思えますか?

答えて

0

の前に、最初のプールを完了して2番目のプールを印刷できないため、アプローチが機能しません。したがって、printの種類は、開始から2番目のプールをブロックします。

スレッドプールを使用して両方のラッパーを同時に開始すると、結果が非​​同期で取得されます。私は大きな数字sleepの代わりにループを作らなければならなかった。なぜなら、Pythonは睡眠が大きすぎると訴えていたからだ。しかし、同じことになります。 私の場合には、一度に、2、を1,2,3 のプリントアウトが存在します。また、待機ループを妥当な値に設定すると、正しい結果が得られます。

from multiprocessing import Pool 
import concurrent.futures 


import time 

sleep_times = 1000000 

def f(x): 
    print(x) 
    for i in range(sleep_times): 
     time.sleep(10) 
    return x*x 

def f2(x): 
    print('**' + str(x) + '**') 
    for i in range(sleep_times): 
     time.sleep(10) 
    return x*x*x; 

def fwrap(l): 
    p = Pool(len(l)) 
    return(p.map(f, l)) 

def fwrap2(l): 
    p = Pool(len(l)) 
    return(p.map(f2, l)) 

if __name__ == '__main__': 
    jr = dict() 
    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: 
     jr[executor.submit(fwrap, (1, 2, 3))] = "f" 
     jr[executor.submit(fwrap2, (1, 2, 3))] = "f2" 

    for future in concurrent.futures.as_completed(jr): 
     ident = jr[future] 
     print(ident,future.result()) 

出力そこ

1 
**1** 
2 
**2** 
**3** 
3 

は、それが( "処理時間" によってブロック)しばらく待つ(スリープループが長すぎる待っ避けるために1に減少):

('f', [1, 4, 9]) 
('f2', [1, 8, 27]) 
+0

こんにちは、apply_asyncの下の私のコードが動作するようです..私はどのようにわからない。あなたはガイドできますか? –

+0

'apply_async'は1つの値に対してのみ機能します。リストを入力として使用してリストを作成したいと思うようです。 'apply_async'はそれをしません。入力の順序から結果の順序を再構築する必要があります。 –

+0

いいえ、私はfとf2の両方を開始したいと思います。もう一方をブロックしてはいけません。 –

関連する問題