推荐学习书目
› 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 · Mar 8, 2018 · 3694 views
    This topic created in 3128 days ago, the information mentioned may be changed or developed.

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

    8 replies  •  2018-03-09 16:50:41 +08:00
    omph
        1
    omph  
       Mar 8, 2018
    要不了解下 Cython
    eryuan
        2
    eryuan  
       Mar 8, 2018
    考虑下 boost 库?
    byaiu
        3
    byaiu  
       Mar 8, 2018
    lua?
    linxy19957
        4
    linxy19957  
    OP
       Mar 9, 2018
    @omph 感谢回复,据我了解,cython 是把 python 代码编译一下加速执行,但是本质上还是需要 python 解释器来执行的,这种情况下不还是需要 GIL 锁吗?
    linxy19957
        5
    linxy19957  
    OP
       Mar 9, 2018
    @eryuan 感谢回复,之前没有接触过 boost 库,刚才简单了解了一下,库调 python 的时候似乎仍然面对 GIL 的问题?
    wlwood
        6
    wlwood  
       Mar 9, 2018
    起另一个进程创建 GIL,应该没啥问题吧?
    wlwood
        7
    wlwood  
       Mar 9, 2018
    我一般是获取原来的 GIL。创建一个新的 GIL 的话,理论上来说,一个进程跑一个 GIL,应该是不会有问题吧?
    justou
        8
    justou  
       Mar 9, 2018
    Cython 里面可以写纯 C 代码, 释放 GIL 有直接语法支持:nogil, 当然 nogil 块里面不能有任何 Python 对象.

    看你这难解难分的设计方法, Python/Cython/C 混编可能是最好的办法了. 个人经验来讲, 无论是 Python 调用 C, 还是 C 调用 Python, Cython 搭桥都是最简单直观的, 可以避免直接处理 Python C API, 这些 Cython 都帮你自动翻译好了.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2577 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:32 · PVG 22:32 · LAX 07:32 · JFK 10:32
    ♥ Do have faith in what you're doing.