下面的策略似乎運作良好:使用多線程與接受()在非阻塞監聽器在每個過程
- 使用單個線程/進程與非阻塞接受()調用監聽套接字上,無論程序如何處理已接受的請求。
- Using multiple threads/processes with a blocking accept() call在每個過程中。當一個連接進入時,這隻會喚醒一個accept()。
什麼不好運行是EPOLLIN在回調中用accept()看每個線程/進程的監聽套接字。這會喚醒每個線程/進程,儘管只有一個人可以成功接受()ing。這就像阻塞accept()的糟糕的舊時代,當連接會進入時導致踩踏事件。
有沒有辦法讓一個線程/進程在仍然使用EPOLLIN的情況下喚醒accept()?或者我應該重寫使用阻塞accept(),只是使用線程隔離?
這不是隻有一個線程/進程運行accept()的選項,因爲我試圖以一種方式管理進程作爲池,每個進程不需要知道它是否是唯一的守護進程接受()在偵聽器套接字上。
使用'EPOLLONESHOT',我仍然可以從'accept()'看到'EAGAIN'。這是預期的嗎?我沒有看到我只用'EPOLLIN'做的踩踏事件,但是我是否仍然期望某些進程無法接受()?? –