关于 Python 和 C 之间相互调用的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
linxy19957
V2EX    Python

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

  •  
  •   linxy19957 2018-03-08 20:58:59 +08:00 3173 次点击
    这是一个创建于 2854 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    8 条回复    2018-03-09 16:50:41 +08:00
    omph
        1
    omph  
       2018-03-08 21:50:17 +08:00
    要不了解下 Cython
    eryuan
        2
    eryuan  
       2018-03-08 21:53:37 +08:00
    考虑下 boost 库?
    byaiu
        3
    byaiu  
       2018-03-08 22:10:05 +08:00
    lua?
    linxy19957
        4
    linxy19957  
    OP
       2018-03-09 10:44:31 +08:00
    @omph 感谢回复,据我了解,cython 是把 python 代码编译一下加速执行,但是本质上还是需要 python 解释器来执行的,这种情况下不还是需要 GIL 锁吗?
    linxy19957
        5
    linxy19957  
    OP
       2018-03-09 10:49:14 +08:00
    @eryuan 感谢回复,之前没有接触过 boost 库,刚才简单了解了一下,库调 python 的时候似乎仍然面对 GIL 的问题?
    wlwood
        6
    wlwood  
       2018-03-09 12:31:23 +08:00
    起另一个进程创建 GIL,应该没啥问题吧?
    wlwood
        7
    wlwood  
       2018-03-09 12:33:42 +08:00
    我一般是获取原来的 GIL。创建一个新的 GIL 的话,理论上来说,一个进程跑一个 GIL,应该是不会有问题吧?
    justou
        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 都帮你自动翻译好了.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2762 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 10:40 PVG 18:40 LAX 02:40 JFK 05:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86