Python:多处理imap&动态创建的池冻结

时间:2013-05-22 06:29:43

标签: python multiprocessing

有人可以解释为什么这段代码会冻结(永远挂起),

import multiprocessing
def foo(x): return x
def main():
    print(list(multiprocessing.Pool().imap(foo, iter([1, 2, 3]))))
main()

虽然这种变体可以正常工作,但

import multiprocessing
def foo(x): return x
pool = multiprocessing.Pool()
def main():
    print(list(pool.imap(foo, iter([1, 2, 3]))))
main()

与此一样,

import multiprocessing
def foo(x): return x
def main():
    print(list(multiprocessing.Pool().map(foo, [1, 2, 3])))
main()

顺便说一句,能够在应用程序的非初始化阶段动态创建multiprocessing.Pool(),然后使用imap将非常有帮助。我尝试在gdb中单步执行它,它似乎冻结在PyThread_acquire_lock ...但我觉得在如此低的级别上进行了非常多的元素调试。

1 个答案:

答案 0 :(得分:0)

显然这是Python 2.6.7的一个错误,至少已经通过Python 2.7.3修复了。

这可以通过使用我的vimap包[https://github.com/gatoatigrado/vimap]。

来解决