我有一个Python程序,它创建一个多处理池并调用一个Cythonized过程,该过程执行一些繁重的计算,调用sin
,cos
,exp
,tan
,{{来自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上不起作用。
答案 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