1
import multiprocessing as mp
import time

def build(q):
    print 'I build things'
    time.sleep(10)
    #return 42
    q.put(42)

def run(q):
    num = q.get()
    print num

    if num == 42:
        print 'I run after build is done'
        return
    else:
        raise Exception("I don't know build..I guess")

def get_number(q):
    q.put(3)

if __name__ == '__main__':
    queue = mp.Queue()

    run_p = mp.Process(name='run process', target=run, args=(queue,))
    build_p = mp.Process(name='build process', target=build, args=(queue,))
    s3 = mp.Process(name='s3', target=get_number, args=(queue,))

    build_p.start()
    run_p.start()
    s3.start()

    print 'waiting on build'
    build_p.join(1) # timeout set to 1 second
    s3.join()

    print 'waiting on run'
    run_p.join()

    queue.close()
    print 'waiting on queue'
    queue.join_thread()
    print 'done'

私の目標は、さまざまなワーカーに送信することbuildであり、続行するには結果を取得する必要があります。runrunbuild

あなたの助けに基づいて修正された上記のコードは、チャンスがあるs3前に返されるため、実際には例外を返します。build

キューの先頭の値は 3 になりました。どうすればbuildプロセスから確実に回答が返ってくるのでしょうか?

ありがとう。

4

1 に答える 1

3

あなたの質問は少し曖昧です.あなたが説明している問題は同期しているように聞こえるので、3つのプロセスは少しやり過ぎです.

run に値を渡そうとしているだけだと仮定すると、キュー オブジェクトを使用できます。

import multiprocessing as mp
import time

def build(q):
    print 'I build things'
    time.sleep(5)
    q.put(42)
    return 

def run(q):
    while True:
        num = q.get()
        if num == 42:
            print 'I run after build is done'
            return
        else:
            print 'not the right number...'

    def get_number():
        return 41

if __name__ == '__main__':
    queue = mp.Queue()

    run_p = mp.Process(name='run process', target=run, args=(queue,))
    build_p = mp.Process(name='build process', target=build, args=(queue,))

    run_p.start()
    build_p.start()

    print 'waiting on build'
    build_p.join()
    print 'waiting on run'
    run_p.join()
    queue.close()
    print 'waiting on queue'
    queue.join_thread()
    print 'done'
于 2012-06-26T22:25:25.357 に答える