关于Boost::Python和Boost::Threads的问题
我和朋友正在开发一个使用Boost::Python的应用程序。我在C++中定义了一个接口(其实是一个纯虚类),通过Boost::Python向用户暴露出来,用户需要继承这个接口并创建一个类,应用程序会使用这个类来进行某种回调机制。
到目前为止,一切都进行得很顺利。现在,回调函数可能需要一些时间来执行(用户可能编写了一些比较复杂的代码)……但我们需要重新绘制窗口,以免看起来“卡住”了。我们想用Boost::Thread来解决这个问题。因为一次只会有一个回调在运行(没有其他线程会同时调用Python),所以我们觉得这应该没什么大问题……因为我们在Python内部和为Python封装的C++代码中都不使用线程。
我们所做的是在调用Py_Initialize()之后,立刻调用PyEval_InitThreads(),然后在自己的Boost线程中调用回调函数之前,我们使用宏PY_BEGIN_ALLOW_THREADS,在线程结束时使用宏PY_END_ALLOW_THREADS。
我想我不需要说,执行从来没有到达第二个宏。每次运行时都会出现几个错误……而且总是在调用实际的回调时出现。我在网上查了很多资料,甚至阅读了一些关于线程的PEP文档,但它们都在讨论Python模块内部的线程(而我并没有,因为这只是一个暴露出来的纯虚类)或者Python内部的线程,而不是关于主应用程序从多个线程调用Python的情况。
请帮帮我,这让我困扰了好几个小时。
附言:求助!
1 个回答
在Python中,可以通过多个线程依次调用,这我觉得没什么问题。听起来你的错误可能是因为C++代码写得不好,因为你提到错误发生在PY_BEGIN_ALLOW_THREADS和PY_END_ALLOW_THREADS之间。
如果你确定不是这个原因,能不能多贴一些你的实际代码,具体说明一下出错的地方和错误信息是什么?