在Python中,套接字应该是非阻塞的吗?
- 在Python中,使用
select.select
时,套接字应该设置为非阻塞模式吗? - 如果设置为非阻塞和阻塞有什么区别?
有时候我发现,当我在一个可以发送数据的套接字上调用send
时,它会阻塞,也就是说会停下来等一段时间才能继续。并且我发现,阻塞模式的套接字通常会发送整个缓冲区的数据(128 KiB)。而在非阻塞模式下,发送的数据量会少得多(大约20-40 KiB),而且返回的速度会更快。我是在使用Python 3.1版本。
1 个回答
5
这个回答可能跟操作系统有关,不幸的是,我只谈谈Linux的情况。
我对在select中阻塞和非阻塞套接字的区别不太了解,但在Linux中,select
系统调用的手册里有一段关于“BUGS”的内容:
在Linux下,select()可能会错误地报告一个套接字文件描述符为“可以读取”,但实际上后续的读取操作却会阻塞。这种情况可能发生在数据到达了,但检查后发现数据的校验和不对,因此被丢弃。还有其他情况也可能导致文件描述符被错误地报告为准备就绪。因此,对于那些不应该阻塞的套接字,使用O_NONBLOCK可能更安全。
我怀疑在Python的抽象层上能否“隐藏”这个问题而不产生副作用。
至于阻塞写入发送更多数据,这是正常现象。如果套接字是阻塞的,send
会一直等待,直到有足够的缓冲区空间来传送你整个请求。如果套接字是非阻塞的,它只会发送当前可以放入套接字发送缓冲区的数据量。