编程语言
首页 > 编程语言> > c-解释Python扩展多线程

c-解释Python扩展多线程

作者:互联网

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.

标签:boost-python,multithreading,python,c-4
来源: https://codeday.me/bug/20191024/1917773.html