以下策略似乎效果很好:
- 在侦听器套接字上使用带有非阻塞accept() 调用的单个线程/进程,而不管程序如何处理接受的请求。
- 在每个进程中使用带有阻塞 accept() 调用的多个线程/进程。当一个连接进来时,这恰好唤醒了一个accept()。
不能正常工作的是 EPOLLIN 在回调中使用 accept() 监视每个线程/进程的侦听器套接字。这会唤醒每个线程/进程,尽管只有一个可以成功地实际接受()。这就像过去阻塞 accept() 的糟糕日子一样,当连接进入时会导致踩踏。
有没有办法在仍然使用 EPOLLIN 的同时只唤醒一个线程/进程来接受()?或者我应该重写以使用阻塞接受(),只是使用线程隔离?
只有一个线程/进程运行accept()不是一个选项,因为我试图以一种方式将进程作为一个池来管理,每个进程不需要知道它是否是唯一的守护进程accept()侦听器套接字。