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' 重复打印,您需要将客户端代码更新为重复 connect
、send
和 close
。否则,您的服务器将在等待新连接时在第二次迭代时阻塞。
做这样的事情:
#client
import socket
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
connection.connect(('localhost', 8600))
connection.send('hello world!')
connection.close()
我是 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' 重复打印,您需要将客户端代码更新为重复 connect
、send
和 close
。否则,您的服务器将在等待新连接时在第二次迭代时阻塞。
做这样的事情:
#client
import socket
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
connection.connect(('localhost', 8600))
connection.send('hello world!')
connection.close()