好吧,这可能是一个奇怪的情况,但请原谅我。
我有一个Python程序,它通过SWIG接口调用一个c++类。我必须从c++库中异步发送信号(以更新状态)Python代码。最初,我使用了低效的繁忙循环来轮询一个标志。我想用SIGUSR1
来代替它。
所以,问题是我发现,即使这些是单独的"线程",它们共享相同的PID。也就是说,Python和c++程序都报告相同的PID。我使用kill
发送了信号,Python代码在其处理程序中捕获了它,但是它没有像我期望的那样中断代码。我尝试了在Python代码中等待信号的两种方法,第一种是py调用Python的signal.pause
,我读到它应该在接收信号时被抢占。另一个是一个简单的time.sleep
,它应该做基本相同的事情-当信号通过时返回。
由于某些原因,这不起作用-我的c++代码发送信号,Python代码接收它并调用处理程序,然而,pause/sleep调用永远不会返回。
如果有可能正确地给同一个进程发信号,你会怎么做?
(如果这只是愚蠢的原谅我,继续)
信号不适合这里的工作。通常,这将是一个用于线程间同步原语的作业,例如
- 来自线程模块的锁
- 线程模块中的事件对象
然而,在c++中操作Python线程锁并不容易。所以我会使用传统但非常简单的方法
- 是一个管道,Python线程从中读取,c++线程在想要唤醒Python时正好向其中写入一个字节。
如果您在同一个程序中,我不确定在这种情况下您需要什么信号。看一下观察者模式。如果你让python事件处理程序订阅c++库中的事件,你可以一起避免信号。