2013-06-25 121 views
3

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

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

非常感谢,

回答

3

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

如果你在线程中使用select(2),那么你可以使用self-pipe trick(这是Twisted自己如何做到这一点以满足自己的线程控制需求)。

但是,如果你在一个线程中使用select(2),那么也许你应该使用一个线程,而是执行IFileDescriptor,并用它在反应器的IReactorFDSet实施得到它准备的事件考虑。这样你可以避免线程,让反应堆实际实现事件循环,并且仍然可以获得原始套接字。

+0

太棒了!我实现了一个IReadDescritpor从原始套接字读取数据,现在它运行良好!非常感谢。 – Houcheng

+0

在Python中使用自管技巧发现了一个很好的例子http://ruslanspivak.com/2012/06/24/self-pipe-trick/ – David