我正在编写的网络库需要通过TCP套接字发送和接收消息 . 可以随时发送或接收消息,即应作为全双工信道 .
我能够使用两个线程来实现这样的场景:主线程调用send()和一个主要在recv()调用时阻塞的专用线程 .
我的问题是:是否可以用单个线程实现相同的场景?即通过注册一些回调函数?
作为旁注:我需要在C,Java和Python中实现这个场景 .
是的,有可能 . 您需要使用允许多路复用I / O的API . 在C / C和Python下,您可以使用select()和非阻塞I / O,因此您阻止的唯一网络调用是select() . 还有poll()和epoll()以及许多其他类似的API,它们可以实现相同的效果,具有不同程度的效率和可移植性 . Java也有non-blocking I/O APIs .
另一种可能性是使用异步I / O,您可以告诉操作系统启动I / O事务,并通知您(通过某种机制)何时完成操作 . 然而,我不熟悉那种网络编程风格,所以我不会试图提供细节 .
通常,库可以通过在应用程序的主循环/事件循环中提供接口来实现此目的 .
例如,大多数使用单线程网络的应用程序都有一个主循环,可以阻止 select() , poll() 或类似 . 您的库只返回应用程序应该包含在其 select() / poll() 调用中的文件描述符,以及应用程序在该文件描述符可读时应调用的回调函数 .
select()
poll()
2 回答
是的,有可能 . 您需要使用允许多路复用I / O的API . 在C / C和Python下,您可以使用select()和非阻塞I / O,因此您阻止的唯一网络调用是select() . 还有poll()和epoll()以及许多其他类似的API,它们可以实现相同的效果,具有不同程度的效率和可移植性 . Java也有non-blocking I/O APIs .
另一种可能性是使用异步I / O,您可以告诉操作系统启动I / O事务,并通知您(通过某种机制)何时完成操作 . 然而,我不熟悉那种网络编程风格,所以我不会试图提供细节 .
通常,库可以通过在应用程序的主循环/事件循环中提供接口来实现此目的 .
例如,大多数使用单线程网络的应用程序都有一个主循环,可以阻止
select()
,poll()
或类似 . 您的库只返回应用程序应该包含在其select()
/poll()
调用中的文件描述符,以及应用程序在该文件描述符可读时应调用的回调函数 .