python3.x库socketserver是非阻塞的吗?

时间:2016-07-31 12:09:10

标签: python sockets nonblocking socketserver

我正在阅读socketserver.py代码,并且我发现它正在使用selectors.PollSelector(如果可用)。但是在主套接字或tcp连接套接字上没有setblocking(0)。有人可以解释为什么套接字设置为阻塞,因为它是默认套接字行为?

修改

我做了很少的测试,我甚至应该更改标题......但是当你选择使用select时,socket是否处于阻塞状态是否重要?因为在这段代码中,True setblocking上的/ false无效。

import sys
import socket
from time import sleep
import select

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1',9999))
s.setblocking(1) # does it matter?
s.listen(10)
timeout=100
inp = [s]
out = []

def worker(client,num):
    print('Worker sending out',client,num)
    client.send( str(str(num)+'\n').encode('utf-8'))
    sleep(0.3)

server_client = {}
while True:
    print('in loop')
    try:
       inputready,outputready,_ = select.select(inp,out,[],timeout)
       for server in inputready:
           if server == s:
               print('accept',server)
               client, address = server.accept()
               client.setblocking(1) # does it matter?
               inp.append(client)
               out.append(client)
       for server in outputready:
           if server in server_client:
               server_client[server] += 1
           else:
               server_client[server] = 0
           worker(server,server_client[server])

    except BlockingIOError:
        print('ERR blocking')
        pass

1 个答案:

答案 0 :(得分:1)

答案简短:

对于select(),如果套接字/流/文件句柄阻塞或没有阻塞,则没有区别。 只读取或写入套接字,并且只有在没有可用数据的情况下,行为才会有所不同。

解释(基于Linux):

  • 阻塞套接字上的读取呼叫将等待数据可用,或者如果套接字已关闭则返回零字节。
  • 非阻塞套接字上的读取呼叫将返回数据(如果可用)或返回错误EAGAIN。后者向上层库发出信号,表明没有数据可用。
  • 如果基础传输层的发送缓冲区已满,阻塞套接字上的写入调用可能会阻止。
  • 非阻塞套接字上的写入调用将在发送缓冲区已满时返回错误EAGAIN,表示调用方稍后再次尝试。