异步 I/O 多路复用(套接字和线程间)

Posted

技术标签:

【中文标题】异步 I/O 多路复用(套接字和线程间)【英文标题】:asynchronous I/O multiplexing (socket and inter-thread) 【发布时间】:2013-04-19 20:08:35 【问题描述】:

我想让 Python 线程等待来自一个套接字(串行端口、TCP/IP 等)的数据,或者等待来自另一个线程的数据。

我想要一个可移植的 Windows 和 Linux 解决方案。

我正在寻找类似于 select.select() 但我相信我不能在 Windows 上使用 select.select() 进行线程间通信。

这很容易吗?

【问题讨论】:

【参考方案1】:

您确定有必要使用线程吗?您是否使用了一些需要使用的外国 API?

无论如何,使用 Twisted,您可以轻松地以便携方式监听任何类似文件的文件(包括串行端口和 TCP 套接字)。此外,如果您确实需要使用线程,Twisted 提供了几个工具来执行此操作。根据您的描述,最简单的方法是调用reactor.callFromThread。如果你想取回数据而不是简单地调用反应器线程中的函数,Twisted 提供了twisted.internet.threads.blockingCallFromThread,它将阻塞直到反应器线程中的函数返回(或者,如果它返回延迟,直到延迟触发)。

【讨论】:

没有必要使用线程,但我的想法是每个协议逻辑单元都有 1 个线程。 Twisted 看起来相当复杂。你知道底层机制吗?也许只有 2 个线程和一个队列? 是的,我对底层机制非常熟悉。我认为它比使用线程复杂得多,尽管我可以理解这在表面上可能并不明显:)

以上是关于异步 I/O 多路复用(套接字和线程间)的主要内容,如果未能解决你的问题,请参考以下文章

2017.07.12 Python网络编程之使用多路复用套接字I/O

多路复用之selectepollpoll

I/O多路复用-EPOLL探索

I/O 多路复用的特点:

IO多路复用之selectpollepoll

五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O