python脚本挂起导入模块与多处理代码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python脚本挂起导入模块与多处理代码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1711字,纯文字阅读大概需要3分钟。
内容图文
![python脚本挂起导入模块与多处理代码](/upload/InfoBanner/zyjiaocheng/734/cd747bce6326435faecfbccfd203dec1.jpg)
我正在尝试导入一个简单的模块,它使用多处理到我的主文件中.使用多处理的模块从asyncresult.get()获得计算结果.通过导入脚本调用此例程时,只会挂起并且不会继续.
这是一个小例子.
import_test.py(要导入的模块)
import sys
import multiprocessing as mp
if not hasattr(sys.stdin, 'close'):
def dummy_close():
pass
sys.stdin.close = dummy_close
# simple test function to compute in parallel
def testf(x):
return x*x
# multiprocessing code
pool = mp.Pool()
results = []
for i in range(0,2):
results.append(pool.apply_async(testf, [i]))
for i in range(0,2):
print results[i].get()
pool.close()
pool.join()
main.py(简单的脚本只导入代码,应该从import_test打印)
if __name__ == '__main__':
import import_test
print "done"
运行脚本时,我可以看到导入发生,但是第一次调用结果[i] .get()(asyncresult.get()例程)时整个脚本挂起并且不会继续而不会抛出任何错误.我在Mac OS X(El Capitan)和Windows 10下运行了两个明显不同的python设置.结果始终是上述行为.
如果我只是将导入模块中的代码放入main.py本身,一切正常.当然我的实际代码比这更复杂,我想在要导入的模块中保持并行计算.
我该如何解决这个问题?
解决方法:
我可能来得太晚了,但我想我能回答你的问题.我有一段时间回来了.它源于Python在导入期间如何处理GIL锁定以及它如何与多处理冲突创建死锁.
您应该看看https://docs.python.org/2/library/imp.html.问题如下:Python在执行导入时获取GIL锁定并在最后释放它.因此,当您在导入的模块中通过多处理运行线程并且需要获取锁时,会发生死锁.这就是为什么我建议你在主文件中进行多处理.
如果由于某种原因你绝对想在导入过程中进行多处理,那么还有一个解决方案:
import imp
if imp.lock_held():
imp.release_lock()
# do your multiprocessing stuff
imp.acquire_lock() # Don't forget this import needs to have the lock acquired at the end of the import
如果你没有让imp重新获得锁,你将得到一个运行时异常.
我希望这显示对某人有帮助.
内容总结
以上是互联网集市为您收集整理的python脚本挂起导入模块与多处理代码全部内容,希望文章能够帮你解决python脚本挂起导入模块与多处理代码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。