有没有办法让boost::python控制每次与python交互的python GIL?在
我正在用boost::python编写一个项目。我试图为外部库编写C++包装,并用Python脚本控制C++库。我不能更改外部库,只能更改包装程序。我说我是在写一个功能测试的应用程序
外部库是用C语言编写的,它使用函数指针和回调来完成许多繁重的工作。它是一个消息传递系统,因此当消息传入时,会调用回调函数。在
我在我的库中实现了一个观察者模式,这样多个对象可以监听一个回调。我有所有的主要球员适当的出口,我可以很好地控制到一定程度。在
外部库创建线程来处理消息、发送消息、处理等。其中一些回调可能是从不同的进程调用的,我最近发现python不是线程安全的。在
这些观察者可以在python中定义,所以我需要能够调用python,python需要在任何时候调用我的程序。在
我把物体和观察者设置成这样class TestObserver( MyLib.ConnectionObserver ):
def receivedMsg( self, msg ):
print("Received a message!")
ob = TestObserver()
cnx = MyLib.Conection()
cnx.attachObserver( ob )
然后创建一个发送到连接的源,然后调用receivedMsg函数。在
所以是个常客源.send(‘MSG’)将进入我的C++应用程序,转到C库,它将发送消息,连接将得到它,然后调用回调,它返回到我的C++库,并且连接尝试通知所有的观察者,在这里,Python类是这里的,所以它调用该方法。在
当然,回调是从连接线程调用的,而不是从主应用程序线程调用的。在
昨天一切都崩溃了,我无法发送一条消息。在翻阅了Cplusplus sig的档案之后,我了解了GIL和一些漂亮的函数来锁定东西。在<> P>我的观察器类的C++ Python包装看起来像现在的
^{pr2}$
不过,当我试着发送250多条这样的信息时,这是有效的for i in range(250)
source.send('msg")
它又崩溃了。和以前一样的信息和症状PyThreadState_Get: no current thread
所以我想这次我的C++应用程序有问题,而不是调用Python。在
我的问题是,有没有什么方法可以让boost::python在每次与python的交互中处理GIL本身?我在代码中找不到任何东西,而且很难找到源.send调用进入boost\u python:(