写了个Python C扩展,用遍了三种实现方式:
- ctypes
- cython
- raw python c-api
碰到了经典的GIL全局locker问题(怀疑中),确定底层自己的C代码采用了线程安全
Python中单线程正常,Python多线程执行都出线莫名其妙的退出问题
如果是Python直接调用底层C的多线程routine,一切正常
写了个Python C扩展,用遍了三种实现方式:
碰到了经典的GIL全局locker问题(怀疑中),确定底层自己的C代码采用了线程安全
Python中单线程正常,Python多线程执行都出线莫名其妙的退出问题
如果是Python直接调用底层C的多线程routine,一切正常
python线程是源生线程,windows下可以用工具查看得到,python c在windows下调用_beginthread函数(Linux 下调用 pthread api)来创建新线程。python的线程调度最终实际上仍然是由系统来完成。只不过由于gil的存在,python线程在获得许可执行之后,要先去请求 interpreter资源,当看到interpreter目前被锁,会继续进入睡眠状态,等待下一次唤醒。一般python线程大概执行100条python字节指令就会释放interpreter资源(仅限多线程环境下,即import 过threading或_thread模块)。
楼主的问题,我觉得是c扩展开了新线程,然后这些线程其实是不被GIL限制的。没有做好c扩展新开线程和python线程的线程安全问题。
引用来自“ChenQi”的答案
没代码一切白搭。
异常退出?c扩展有开新的线程?你是把线程的调度管理交付给python(依赖系统),还是直接依赖系统?
引用来自“用户名已存在”的答案
没代码一切白搭。
异常退出?c扩展有开新的线程?你是把线程的调度管理交付给python(依赖系统),还是直接依赖系统?
我曾经想用OpenMP去对付GIL(不是用Cython那种方式,Cython其实是自动生成的C扩展):我用的是Python2.5...
但是不管我用C去控制Python虚拟机(C 可以用OpenMP)还是用Python多线程去调用C,结果都是一样的:无效...
第一种直接非法操作... 第二种GIL继续发挥作用...
引用来自“sam_ai”的答案
我曾经想用OpenMP去对付GIL(不是用Cython那种方式,Cython其实是自动生成的C扩展):我用的是Python2.5...
但是不管我用C去控制Python虚拟机(C 可以用OpenMP)还是用Python多线程去调用C,结果都是一样的:无效...
第一种直接非法操作... 第二种GIL继续发挥作用...
可不是么,现在要用多线程只能这么做....(Cython也是这么搞的)
但是这样Python的作用更低了...我很多时候干脆直接用C了。
引用来自“sam_ai”的答案
引用来自“sam_ai”的答案
我曾经想用OpenMP去对付GIL(不是用Cython那种方式,Cython其实是自动生成的C扩展):我用的是Python2.5...
但是不管我用C去控制Python虚拟机(C 可以用OpenMP)还是用Python多线程去调用C,结果都是一样的:无效...
第一种直接非法操作... 第二种GIL继续发挥作用...
可不是么,现在要用多线程只能这么做....(Cython也是这么搞的)
但是这样Python的作用更低了...我很多时候干脆直接用C了。
是不是我们都没有注意到某些trick导致的啊
摘自pyzmq项目中的线程处理细节,pyzmq多线程没出问题,我直接在python C-api中调用了依然无效,