当一个程序在等待数据,另一个并行的程序可以继续处理它们自己的客户端,另外的处理方法是只处理在给定时间内正真要进行通信的客户端,不需要一直监听。这就是异步。
测试代码如下:
-
#!/bin/env python
-
import socket
-
import select
-
s = socket.socket()
-
-
HOST,PORT = '',1234
-
-
s.bind((HOST,PORT))
-
s.listen(5)
-
inputs = [s]
-
print inputs
-
while True:
-
rs,ws,es = select.select(inputs,[],[])
-
print rs
-
for r in rs:
-
print r
-
print s
-
if r is s:
-
c,addr = s.accept()
-
print 'Got connection from ',addr
-
inputs.append(c)
-
print inputs
-
else:
-
try:
-
data = r.recv(1024)
-
disconnected = not data
-
except socket.error:
-
disconnected = True
-
if disconnected:
-
print r.getpeername(),'disconnected'
-
inputs.remove(r)
-
else:
-
print data,
通过调试得出如下结论:
1、当有客户端第一次连接服务器端的时候,inputs序列的值就是服务器端的socket,然后在while循环的开始,将inputs序列了存储的服务器socket赋值给变量rs
2、for循环r取得服务器的socket,当前rs里面只有服务器socket,然后通过if条件判断,当for遍历的r 是 服务器socket,取得客户端socket和地址信息,然后在将客户端的地址信息append到inputs序列,if执行完毕。
3、按照通常情况下,此时程序应该是在accept()阻塞着并等待客户端再次连接。如果是这样,程序就会一直不停的append。
4、程序在accept()之前调用了select()函数,调用的意义就是:首先select()函数在这里起到了独立阻塞的作用,直到该客户端再次连接。
5、当另一个客户端再次连接服务器socket时,第一次连接和第2、3点解释的一样。这样通过select()函数就实现了异步连接。
6、其实select()异步连接就有点像Linux的虚拟终端,最高进程init 然后可以通过ssh工具连接很多shell,但是每个shell又是相互独立的。
异步是非阻塞的,调用后即返回,不等待;同步是阻塞的,等待,直到成功为止
不知道以上对于python select模块网络异步连接理解的有没有问题,请指教。
阅读(2870) | 评论(0) | 转发(0) |