11.2.7 非阻塞通信和超时
默认地,socket被配置为发送或接收数据时会阻塞,在套接字准备就绪之前将停止程序的执行。send()调用等待有缓冲区空间来存放发出的数据,recv()则等待其他程序发出数据来读取。这种形式的I/O操作很容易理解,不过可能导致操作很低效,如果两个程序最后都在等待对方发送或接收数据,那么可能会导致死锁。
有很多种方法来绕开这种情况。一种做法是对各个套接字分别使用单独的线程完成通信。不过,这可能引入线程间通信的其他复杂性。另一种选择是将套接字改为根本不阻塞,即使没有准备好来处理操作,也会立即返回。可以使用setblocking()方法改变一个套接字的阻塞标志。默认值为1,这表示会阻塞。传入值0则会关闭阻塞。如果套接字将阻塞关闭,而且没有为处理操作做好准备,则会产生一个socket.error。
一种折中的解决方案是为套接字操作设置一个超时值。可以使用settimeout()将socket的超时值改为一个浮点值,表示确定这个套接字未做好操作准备之前所阻塞的时间(秒数)。超过这个超时期限时,会产生一个timeout异常。
第十一章:网络通信-socket:网络通信-非阻塞通信和超时
最新推荐文章于 2021-07-27 15:09:26 发布