关于 Python 和 C 之间相互调用的问题

2018-03-08 20:58:59 +08:00
 linxy19957

事情是这样的,首先我用 c 写了一个 python 模块,由于这个模块里涉及了大量与 python 环境无关的 io 和运算,于是我在进入模块的开始就释放了 GIL,结束前再获取 GIL,然后返回结果,模块现在自由地奔跑了起来。 模块跑到了一半,现在有一个功能用 C 来实现实在是太复杂了,我想用 python 来写这部分的代码,当然,我可以在这里获取 GIL,运行代码,再释放 GIL。但是原来的 python 环境本身任务就非常繁重,而我的模块中间想插入的 python 代码调用也非常频繁,因此在这里获取 GIL 似乎有点浪费性能,毕竟我插入的 python 代码与原来的环境其实没什么关系(我不需要原来 python 环境里的任何模块或者变量,也不需要创建什么让原来的环境访问)。因此我在思考能不能不获取原环境的 GIL,另外新起一个 python 环境来跑我插入的 python 代码,又或者是在没有 GIL 的情况下安全执行我的代码? 我目前做了一点尝试,但是结果基本就是 python 环境崩溃,不知道有没有人做过类似的工作可以提供一点经验?万分感谢

2570 次点击
所在节点    Python
8 条回复
omph
2018-03-08 21:50:17 +08:00
要不了解下 Cython
eryuan
2018-03-08 21:53:37 +08:00
考虑下 boost 库?
byaiu
2018-03-08 22:10:05 +08:00
lua?
linxy19957
2018-03-09 10:44:31 +08:00
@omph 感谢回复,据我了解,cython 是把 python 代码编译一下加速执行,但是本质上还是需要 python 解释器来执行的,这种情况下不还是需要 GIL 锁吗?
linxy19957
2018-03-09 10:49:14 +08:00
@eryuan 感谢回复,之前没有接触过 boost 库,刚才简单了解了一下,库调 python 的时候似乎仍然面对 GIL 的问题?
wlwood
2018-03-09 12:31:23 +08:00
起另一个进程创建 GIL,应该没啥问题吧?
wlwood
2018-03-09 12:33:42 +08:00
我一般是获取原来的 GIL。创建一个新的 GIL 的话,理论上来说,一个进程跑一个 GIL,应该是不会有问题吧?
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 都帮你自动翻译好了.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/436289

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX