Jon*_*han 5 c++ python multithreading swig gil
我正在使用SWIG将第三方C++包集成到python应用程序中.该程序包通过网络连接到专有API并接收更新.整个流程是python实例化一个C++对象,调用它的函数来设置它,然后等待更新.
我使用SWIG的director功能为更新实现了一个回调机制,并且在从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.
Run Code Online (Sandbox Code Playgroud)
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++ 代码。)
| 归档时间: |
|
| 查看次数: |
2216 次 |
| 最近记录: |