Tag: boost python

Python,Threads,GIL和C ++

是否有一些方法可以使boost :: python控制Python GIL与python的每次交互? 我正在用boost :: python编写一个项目。 我正在尝试为外部库编写C ++包装器,并使用python脚本控制C ++库。 我无法更改外部库,只能更改我的包装器程序。 (我正在为所述外部库编写function测试应用程序) 外部库是用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函数。 所以常规的source.send(’msg’)将进入我的C ++应用程序,转到C库,它将发送消息,连接将获取它,然后调用回调,然后返回到我的C ++库和连接尝试通知所有观察者,此时此处是python类,因此它调用该方法。 当然,回调是从连接线程调用的,而不是主应用程序线程。 昨天一切都崩溃了,我无法发送1条消息。 然后在Cplusplus-sig档案中挖掘后,我了解了GIL和一些非常好的function来锁定事物。 所以我的观察者类的C ++ python包装器现在看起来像这样 struct IConnectionObserver_wrapper : Observers::IConnectionObserver, wrapper […]