我写了一个扭曲的程序来处理来自TCP套接字和原始套接字的请求。 由于twisted不支持原始线程,我在名为'raw_socket_loop'的函数中编写raw-socket select poll循环。主反应器程序通过reactor.callInThread()函数创建一个单独的线程来运行此循环。
我的问题是,我在控制台中单击control-C但反应堆无法停止。我认为reactor的主线程接收到这个信号并且处理得很好,但是生成的线程没有收到这个中断信号。多线程反应器程序是否有优雅的关闭建议?
非常感谢,
答案 0 :(得分:3)
线程不可中断。您必须在线程中运行的代码中构建一个机制来接收关闭通知并退出以响应它。
如果你在线程中使用select(2)
,那么你可以使用self-pipe trick(这就是Twisted本身为自己的线程控制需要做的事情)。
但是,如果你在一个线程中使用select(2)
,那么你可能应该考虑 not 使用一个线程,而不是实现IFileDescriptor
并将其与反应堆{一起使用} {3}}实现以获得准备事件。这样你就可以避免线程了,你让反应堆实际上实现了事件循环,你仍然可以获得原始套接字。