Python while 1 循环行为事件触发了吗?

Python while 1 loop behaviour event triggered?

我是 python 的新手,想了解更多套接字。

我有 2 个测试脚本:

# server
import socket

connectionListener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connectionListener.bind(('', 8600 ))
connectionListener.listen(200)

while 1:
    #accept connections from outside
    (clientsocket, address) = connectionListener.accept()
    #now do something with the clientsocket
    #in this case, we'll pretend this is a threaded server
    print clientsocket.recv(64)
    print 'Boom!'

和:

#client
import socket

connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connection.connect(('localhost', 8600))
connection.send('hello world!')

我习惯的循环行为是它会无休止地发送垃圾邮件 Boom! 字符串。但事实并非如此! while循环看起来更像是事件触发?
Boom!hello world! 仅在连接时刻打印。 它是如何工作的?

只有我离开的时候

while 1:
    print 'Boom!'

它表现得 "normally"(据我所知) 我可以以及如何控制循环行为?

您不会收到“Boom!”垃圾邮件的原因lines 是套接字默认是 blocking。这意味着 socket.recv() 将停止执行,直到收到某些内容。因此,当您使用 while 循环时,循环不会一遍又一遍地重复,因为 recv() 行停止了它。

您可以使用 socket.setblocking 控制此行为,也可以设置套接字,以便阻塞方法超时,因此它们不会永远阻塞。如果你并行地依赖于其他东西 运行 你会想要做后者,但是如果你的程序只是在那里使用套接字,那么永远阻塞它就很好,事实上这是一个很好的方式来保持你的无处理器。

socket.accept 阻塞,直到建立新的连接。如果您希望看到 'Boom' 重复打印,您需要将客户端代码更新为重复 connectsendclose。否则,您的服务器将在等待新连接时在第二次迭代时阻塞。

做这样的事情:

#client
import socket

connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

while True:
    connection.connect(('localhost', 8600))
    connection.send('hello world!')
    connection.close()