首页 > 解决方案 > 在apply async python函数中调用apply async

问题描述

我正在尝试使用 apply_async 函数内部调用一个池,当我尝试将一个函数传递给另一个函数的池时出现序列化对象错误,因此我将第二个池移动到全局但它仍然对我不起作用,我是什么失踪 ?我的代码:

from multiprocessing import Pool
b_pool = Pool(1)

def func_a(i):
    global b_pool
    print "a : {}".format(i)
    try:
        res = b_pool.apply_async(func_b, args=(i,))
    except Exception as e:
        print e

def func_b(i):
    print "b : {}".format(i)
    file = "/home/ubuntu/b_apply.txt"
    f = open(file, "a")
    f.write("b : {}".format(i))
    f.close()


if __name__ == '__main__':
    a_pool = Pool(1)
    for i in range(10):
       res =  a_pool.apply_async(func_a,args=(i,) )

    a_pool.close()
    a_pool.join()

    b_pool.close()
    b_pool.join()

在此代码中,只有 a 打印 0 -9 而 b 甚至不打印到文件。我正在使用 python 2.7

标签: pythonpython-2.7multiprocessing

解决方案


队列是好的方向,只是 multiprocessing.Queue 不能像这样传递,但 Manager.Queue 是这样做的正确方法,我的代码有效:

from multiprocessing import Pool,Manager
def func_a(i,q):
    print "a : {}".format(i)
    try:
        q.put(i)
    except Exception as e:
        print e


def func_b(i,q):
    i = q.get()
    print "b : {}".format(i)


if __name__ == '__main__':
    m = Manager()
    q = m.Queue()
    a_pool = Pool(1)
    b_pool = Pool(1)

    for i in range(10):
        res = a_pool.apply_async(func_a,args=(i,q,) )
        res_2 = b_pool.apply_async(func_b, args=(i,q,))

    a_pool.close()
    a_pool.join()

    b_pool.close()
    b_pool.join()

这个答案在多个进程之间共享结果队列非常有帮助


推荐阅读