Python 为什么当套接字变得可读时,10个选择过程中只有2个被通知?

Python 为什么当套接字变得可读时,10个选择过程中只有2个被通知?,python,linux,sockets,select,Python,Linux,Sockets,Select,在我的应用程序中有10个进程共享一个套接字 他们都在等待使用select使其可读 但我在应用程序日志中注意到,每当套接字变得可读时,这10个进程中只有2个进程 原因可能是什么?我怀疑发生的情况是,第一个进程正在唤醒,从select()返回,并在随后的上下文切换到其他进程之前调用accept() 我不确定select()到底阻塞了什么,也不确定它是如何唤醒的。我怀疑当它从等待中醒来时,它会重新检查队列以查看数据是否仍然可用。如果没有,它将回到等待 我也会重复我的假设。两个进程正在唤醒这一事实表明您

在我的应用程序中有10个进程共享一个套接字

他们都在等待使用
select
使其可读

但我在应用程序日志中注意到,每当套接字变得可读时,这10个进程中只有2个进程

原因可能是什么?

我怀疑发生的情况是,第一个进程正在唤醒,从select()返回,并在随后的上下文切换到其他进程之前调用accept()

我不确定select()到底阻塞了什么,也不确定它是如何唤醒的。我怀疑当它从等待中醒来时,它会重新检查队列以查看数据是否仍然可用。如果没有,它将回到等待

我也会重复我的假设。两个进程正在唤醒这一事实表明您有一个双核处理器。如果您有一个四核,您可能会看到多达4个进程同时唤醒

证明这一理论的一个简单方法是:在调用accept()之前先调用2秒钟的sleep()。我怀疑您会看到所有10个进程都被唤醒,并记录尝试调用accept的情况


如果您的目标是让N个进程(或线程)为传入连接提供服务,那么您的方法可能仍然很好。您可能会从对非阻塞套接字执行select()调用切换到只使用直接调用accept()的阻塞套接字。当传入连接进入时,其中一个进程将从accept()返回,并带有有效的客户端套接字句柄。其他进程仍将被阻止。

这两个进程是否也从套接字读取?@user2864740所有进程都将在可读套接字上调用call
accept
。@satoru可能流量不够大,所以两个进程处理所有进程?@奇怪的是,在我的实验中只有一个请求,我希望所有进程都继续并尝试接受,但除了一个进程之外,其他所有进程都会失败。@freakish我不太理解
竞争条件
部分。为什么会这样?
select
不只是通知所有等待过程吗?我不同意这个理论。1) 在接受之前,我已经用
sleep
做过测试-没有区别。2) 在我的例子中,10个进程中有3个被唤醒(4个cpu核)。但是我检查了PID,它们是随机的,但总是3。我要做更多的测试。select(或者至少是Python的select)似乎有严重的问题。@freakish-我很感谢您的反馈。我很小心地称之为假设/理论,因为我没有做任何测试。如果OP发布了代码那就太好了。我怀疑这里还有更多的事情发生。明天我可能会尝试我自己的复制…我已经发布了我自己的理论。:)我不知道引擎盖下发生了什么,但我做了一些简单的观察并发布了一些代码。@selbie你走的路是对的。当我在接受之前添加一个
睡眠
,更多的进程出现在接受之前。+1:是的,这似乎实际上是正确的理论。我在考试中犯了一些错误。