SWIG C Python多态和多线程

SWIG C Python多态和多线程,第1张

概述我正在使用SWIG将第三方C包集成到python应用程序.该包通过网络连接到专有API并接收更新.整个流程是python实例化一个C对象,调用它的函数来设置它然后等待更新.我使用SWIG's directors feature为更新实现了一个回调机制,并且在从python或python调用的C函数进行测试时,它运行良好.也就是说,我能够在Python中继承一

我正在使用SWIG将第三方C包集成到python应用程序.该包通过网络连接到专有API并接收更新.整个流程是python实例化一个C对象,调用它的函数来设置它然后等待更新.

我使用SWIG’s directors feature为更新实现了一个回调机制,并且在从python或python调用的C函数进行测试时,它运行良好.也就是说,我能够在Python中继承一个C类,从C调用它的虚函数,并看到python代码优先并执行.

问题:
当我从网络收到更新时,我得到:

The thread 'Win32 Thread' (0x1f78) has exited with code 0 (0x0).Unhandled exception at 0x1e0650cb in python.exe: 0xC0000005: Access violation writing location 0x0000000c.

调用回调函数时,python27.dll中会抛出此异常.
我怀疑是这样的:我违反了GIL
AFAIU更新来自不同的线程,并使用该线程调用python的代码.

在这一点上,我很茫然. SWIG的导演功能是否仅限于在python中启动的流程(即来自python托管线程)?
我该如何规避这个?如何引导从C到python的更新?甚至可以使用SWIG吗?
我应该采用完全不同的方法吗?

我愿意接受有关此事的任何建议……

最佳答案如果您的SWIG包装的C代码在线程中调用回调例程,那么可能没有GIL问题 – SWIG生成的代码不执行我见过的任何GIL管理,这意味着当Python代码调用您的C代码,您在整个通话过程中都会保留GIL.

但是,如果您的C代码将回调推迟到另一个线程,那么您很可能违反了GIL.这很简单,可以解决:在调用回调之前,调用PyGILState_Ensure(),当回调完成时,调用PyGILState_Release.请参阅http://docs.python.org/c-api/init.html,“非Python创建的线程”部分. (如果您在此处使用C异常处理,则可能需要格外小心以确保可以释放GIL.)

如果你尚未查看堆栈跟踪,那么值得验证的是,NulL指针deref不是代码中发生的傻事. (您可以使用VS / GDB / WinDBG附加到运行代码的Python进程; Python执行仍然不可思议,但您可以通过这种方式跟踪C代码.)

总结

以上是内存溢出为你收集整理的SWIG C Python多态和多线程全部内容,希望文章能够帮你解决SWIG C Python多态和多线程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1205721.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存