首页 / PYTHON / c-解释Python扩展多线程
c-解释Python扩展多线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c-解释Python扩展多线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1327字,纯文字阅读大概需要2分钟。
内容图文
![c-解释Python扩展多线程](/upload/InfoBanner/zyjiaocheng/688/3d986dd4f5f1477fa8fa032a01eb7bad.jpg)
Python解释器具有全局解释器锁,据我了解,扩展必须在多线程环境中获取它.但是Boost.Python HOWTO page表示扩展功能必须释放GIL并在退出时重新获取它.
我想抵制在这里进行猜测的诱惑,所以我想知道在以下情况下应该是什么GIL锁定模式:
> Extension是从python调用的(大概在python线程中运行).
>扩展程序的后台线程会回调Py_ *函数.
最后一个问题是,为什么链接文件说应该发布GIL并重新获得GIL?
解决方法:
每当Python解释字节码时,当前运行的线程都会保留GIL.在设法获取GIL之前,没有其他Python线程可以运行.
当解释器调用了本机代码时,该代码具有两个与GIL有关的选项:
>它什么也做不了.
>它可以在工作时释放GIL,然后在返回Python之前重新获取它
如果本机代码大量调用了Python的运行时,则应采用选项1:除非持有GIL,否则永远不能安全地调用Python的运行时(少数例外,例如,如果没有,则进行调用以获取GIL有它).
如果本机代码完成了很多工作,而这些工作根本不涉及Python,那么您可以使用选项2:发布GIL之后,Python便可以安排另一个Python线程,从而获得一些并行性.如果您不释放GIL,则在Boost代码运行时,Python的其他线程将无法执行:这就是文档告诉您释放并重新获取GIL的原因.
如果您采用这种方式,那么在释放GIL之前或重新获取GIL之前,必须小心访问Py_ *函数.这可能意味着您必须制作数据的本地副本,因为在发布GIL时无法安全地访问Python数据类型(例如列表或字典元素).
如果在发布GIL时您的Boost代码需要回调到Python,那么您需要获取GIL,进行调用,然后释放GIL.尝试避免从不是由Python创建的线程进行此类调用,因为它们需要额外的工作才能获取GIL.
内容总结
以上是互联网集市为您收集整理的c-解释Python扩展多线程全部内容,希望文章能够帮你解决c-解释Python扩展多线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。