多处理导致Python在Windows上崩溃

时间:2014-12-22 20:59:55

标签: python multiprocessing

我有一个Python程序,它创建一个多处理池并调用一个Cythonized过程,该过程执行一些繁重的计算,调用sincosexptan,{{来自atan的1}}并进行了大量的最小优化。没有多处理,一切正常。

如果我在libc.math上使用multiprocessing.pool所有进程都会收到相当无用的消息

  

此应用程序已请求运行时将其终止   不寻常的方式请联系应用程序的支持团队获取更多信息   信息。

父进程在此之后继续工作,但在关闭应用程序时它也会崩溃。

崩溃转储包含以下信息

pool.join()

更新:我通过调用虚拟函数进行了单独检查。它仍然崩溃。使用map,map_async,apply,apply_async。这只发生在我的程序中。简单的池脚本工作正常。

Pool代码位于 Problem signature: Problem Event Name: APPCRASH Application Name: python.exe Application Version: 0.0.0.0 Application Timestamp: 527fcf56 Fault Module Name: libgcc_s_dw2-1.dll Fault Module Version: 0.0.0.0 Fault Module Timestamp: 4bc96cad Exception Code: 40000015 Exception Offset: 00016646 OS Version: 6.1.7601.2.1.0.256.1 Locale ID: 1033 Additional Information 1: 9155 Additional Information 2: 9155109303dda76ab293160797d571e1 Additional Information 3: de56 Additional Information 4: de566ab6f110978dbca8423195800025

之后

它看起来像是一些地狱"但是我不确定如何或在哪里检查。

我不认为代码在这里有任何帮助,因为即使是非常通用的代码也会崩溃。我无论如何都不能发布整个程序,因为它包含GUI和三个独立的模块。 删除所有主要代码后:

if __name__ == '__main__':

我忘了提。代码(真实的,而不是虚拟的)在OSX上工作,但在Win7上不起作用。

2 个答案:

答案 0 :(得分:0)

我不得不稍微修改你的代码:

from multiprocessing import Pool
def func1(a):
    print a

if __name__ == '__main__':
    nprocs=2
    print 'pool'
    pool = Pool(processes=nprocs)
    print 'results'
    pool.map(func1, range(10))
    print 'close'
    pool.close()
    print 'join'
    pool.join() #crashes here
    print 'ok'

当我运行它时,我得到混合输出:

>C:\Python27\python.exe mp_debug.py
pool
results
02

13

46

57

8
9
close
join
ok

您的功能func1可能需要lock吗?

答案 1 :(得分:0)

问题再次出现,我做了更彻底的调查。我能够将问题追溯到用于编译cython模块的mingw32编译器。安装Microsoft VC ++ for Python 2.7并将其设置为默认编译器后,一切都恢复正常。 这是编译器的链接: http://www.microsoft.com/en-us/download/details.aspx?id=44266