3

我编写了一个扭曲的程序来处理来自 TCP 套接字和原始套接字的请求。由于 twisted 不支持原始线程,所以我在名为“raw_socket_loop”的函数中编写了原始套接字选择轮询循环。主反应器程序通过 reactor.callInThread() 函数创建一个单独的线程来运行此循环。

我的问题是,我在控制台中单击 control-C 但反应堆无法停止。我认为反应器的主线程接收到这个信号并且处理得很好,但是产生的线程没有接收到这个中断信号。多线程反应器程序是否有优雅的关闭建议?

非常感谢,

4

1 回答 1

3

线程是不可中断的。您必须在线程中运行的代码中构建一种机制,以接收关闭通知并退出以响应它。

如果您select(2)在线程中使用,那么您可以使用自管道技巧(这就是 Twisted 本身为自己的线程控制需要这样做的方式)。

但是,如果您select(2)在线程中使用,那么也许您应该考虑使用线程,而是实现IFileDescriptor它并将其与反应器的IReactorFDSet实现一起使用以获取其上的就绪事件。这样可以避免线程,让反应器实际实现事件循环,并且仍然可以获得原始套接字。

于 2013-06-25T11:52:35.037 回答