4

function を呼び出すたびにPool.apply_async、そのプロセスで実行される関数を渡す必要があります。代わりに呼び出し可能なオブジェクトを渡そうとしましたが、何もしませんでした。それを行う方法はありますか?それとも、自分でプールをゼロから設計する必要がありますか?

コードは次のとおりです。

import queue

class TaskThread(object):
    def __init__(self):
        #self.queue=queue.Queue()

    def __call__(self):
        print("in TaskThread.__call__")
        #self.queue.put(1)

pool=multiprocessing.Pool(4)
task=TaskThread()
pool.apply_async(target=task)

そんな感じ。

4

1 に答える 1

3

get()問題は、AsyncResult返されたを呼び出さなかったこと、またはメイン プロセスを終了する前に子プロセスの動作が完了するまで/をapply_async使用しなかったことです。内のすべてのワーカー プロセスはデーモンであるため、メイン プロセスが終了するとすぐに終了します。つまり、子プロセスが何かを出力する前に、サンプル プログラムが終了します (そして、その子プロセスも一緒に)。を呼び出すか、 /呼び出しを追加することで修正できます。pool.closepool.join()Pool.get()AsyncResultclose()join()

class TaskThread(object):
    def __call__(self):
        print("in TaskThread.__call__")

pool=multiprocessing.Pool(4)
task=TaskThread()
pool.apply_async(task)
pool.close()
pool.join()

または:

class TaskThread(object):
    def __call__(self):
        print("in TaskThread.__call__")

pool=multiprocessing.Pool(4)
task=TaskThread()
result = pool.apply_async(task)
result.get()

編集:

Queueあなたがしようとしている方法を渡すためには、次のようなことをする必要があります:

import multiprocessing


class TaskThread(object):
    def __init__(self, manager):
        self.queue = manager.Queue()

    def __call__(self):
        print("in TaskThread.__call__")
        self.queue.put(1)

if __name__ == "__main__":
    pool=multiprocessing.Pool(4)
    m = multiprocessing.Manager()
    task=TaskThread(m)
    result = pool.apply_async(task)
    result.get()
    print(task.queue.get())

出力:

in TaskThread.__call__
1
于 2014-10-15T20:12:10.017 に答える