事情是这样的,首先我用 c 写了一个 python 模块,由于这个模块里涉及了大量与 python 环境无关的 io 和运算,于是我在进入模块的开始就释放了 GIL,结束前再获取 GIL,然后返回结果,模块现在自由地奔跑了起来。 模块跑到了一半,现在有一个功能用 C 来实现实在是太复杂了,我想用 python 来写这部分的代码,当然,我可以在这里获取 GIL,运行代码,再释放 GIL。但是原来的 python 环境本身任务就非常繁重,而我的模块中间想插入的 python 代码调用也非常频繁,因此在这里获取 GIL 似乎有点浪费性能,毕竟我插入的 python 代码与原来的环境其实没什么关系(我不需要原来 python 环境里的任何模块或者变量,也不需要创建什么让原来的环境访问)。因此我在思考能不能不获取原环境的 GIL,另外新起一个 python 环境来跑我插入的 python 代码,又或者是在没有 GIL 的情况下安全执行我的代码? 我目前做了一点尝试,但是结果基本就是 python 环境崩溃,不知道有没有人做过类似的工作可以提供一点经验?万分感谢
1
omph 2018-03-08 21:50:17 +08:00
要不了解下 Cython
|
2
eryuan 2018-03-08 21:53:37 +08:00
考虑下 boost 库?
|
3
byaiu 2018-03-08 22:10:05 +08:00
lua?
|
4
linxy19957 OP @omph 感谢回复,据我了解,cython 是把 python 代码编译一下加速执行,但是本质上还是需要 python 解释器来执行的,这种情况下不还是需要 GIL 锁吗?
|
5
linxy19957 OP @eryuan 感谢回复,之前没有接触过 boost 库,刚才简单了解了一下,库调 python 的时候似乎仍然面对 GIL 的问题?
|
6
wlwood 2018-03-09 12:31:23 +08:00
起另一个进程创建 GIL,应该没啥问题吧?
|
7
wlwood 2018-03-09 12:33:42 +08:00
我一般是获取原来的 GIL。创建一个新的 GIL 的话,理论上来说,一个进程跑一个 GIL,应该是不会有问题吧?
|
8
justou 2018-03-09 16:50:41 +08:00
Cython 里面可以写纯 C 代码, 释放 GIL 有直接语法支持:nogil, 当然 nogil 块里面不能有任何 Python 对象.
看你这难解难分的设计方法, Python/Cython/C 混编可能是最好的办法了. 个人经验来讲, 无论是 Python 调用 C, 还是 C 调用 Python, Cython 搭桥都是最简单直观的, 可以避免直接处理 Python C API, 这些 Cython 都帮你自动翻译好了. |