Python socket.accept() 在调用前阻塞代码?

Python socket.accept() blocking code before call?

我正在尝试学习 Python 套接字,并且已经用 socket.accept() 方法击中了圈套。据我了解该方法,一旦我调用接受,线程将等待传入连接(阻止所有后续代码)。但是,在下面的代码中,我从 https://docs.python.org/2/library/socket.html 获得并使用了本地主机。我在服务器的第一行添加了一个 print('hello') 。然而,直到我断开客户端连接后,打印才会出现。为什么是这样?为什么 accept 在我打印之前似乎 运行 但在我绑定套接字之后?

# Echo server program
import socket

print('hello') # This doesn't print until I disconnect the client
HOST = 'localhost'              
PORT = 50007              
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.sendall(data)
conn.close()
# Echo client program
import socket

HOST = 'localhost'    # The remote host
PORT = 50007              # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)

您可能在 Python 的 IO 无法识别为交互式的系统上使用输出设备。作为解决方法,您可以在 print.

之后添加 sys.stdout.flush()

标准输出是一个缓冲流,这意味着当你打印一些东西时,输出会停留在一个内部缓冲区中,直到你打印足够的数据来填满整个缓冲区(在小程序中不太可能,自助餐有几千字节大小),或者直到程序退出,当所有这些缓冲区被自动刷新时。通常,当输出是终端服务时,IO 层会自动切换到行缓冲,每当打印换行符时也会刷新缓冲区(print 语句会自动插入)。

出于某种原因,这在您的系统上不起作用,您必须显式刷新。另一种选择是 运行 python -u,它应该强制使用无缓冲的标准流。