【关于python的异步通信(IO复用)问题】

【关于python的异步通信(IO复用)问题】

【背景】有一位Q友由于在家不能上网,所以代他发了本帖。希望大家多多交流。他的问题如下:


从网上找到如下代码:

二、使用select实现异步I/O
所谓异步I/O,打个比方,就是如果一大群人都想你听他说话,那么你就给他们每人一分钟的时间说,大家轮流说,没说完的待会儿轮到时再继续说。也就是一个时间片的方法。
要实现异步I/O,我们可以通过使用框架asyncore/asynchat或Twisted,它们都是基于select函数或poll函数(poll只适于类Unix系统)的。select和poll函数都来自select模块。
select函数要求三个必须序列作为参数和一个可选的以秒为单位的超时值。序列中是表示文件描述符的整数值,它们是我们要等待的连接。这三个序列是关于输入、输出和异常条件的。如果超时值没有给出的话,select将处于阻塞状态(也就是等待)直到有文件描述符准备动作。如果超时值给出了,那么select只阻塞给定的时间。如果超时值是0的话,那么将不阻塞。select返回的值是一个由三个序列组成的元组,它们分别代表相应参数的活动的子集。例如,第一个序列返回的是用于读的输入文件描述符构成的序列。
序列可以包含文件对象(不适于Windows)或socket。下面这个例子创建一个使用select去服务几个连接的服务器(注意:服务端的socket自身也提供给了select,以便于它能够在有新的连接准备接受时发出信号通知)。这个服务器只是简单地打印接受自客户端的数据。你可以使用telnet(或写一个基于socket的简单的客户端)来连接测试它。
select server
import socket, select
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))
s.listen(5)
inputs = [s]
while True:
rs, ws, es = select.select(inputs, [], [])
    for r in rs:
        if r is s:
            c, addr = s.accept()
            print 'Got connection from', addr
            inputs.append(c)
        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

但是有很多地方不明白,如上代码中的rs究竟返回什么?客户端第一次连接及连接过后的再次对话是怎么一个过程?这个inputs列表包含了所有连接过来的客户端?不需要用Queue和多线程吗?再者,如果并发数比较大,这个for循环能处理得过来吗?
希望高手能给个稍微完整的但比较简洁的DEMO.多谢!能实现简单的聊天就行.支持并发访问.
使用线程池,以及异步IO,Queue队列!
我对于异步IO实在困惑太多,多谢了!


QUOTE:
原帖由 diyself 于 2008-11-25 08:44 发表
    for r in rs:
        if r is s:
            c, addr = s.accept()
            print 'Got connection from', addr
            inputs.append(c)
        else:
            try:
                data = r.recv(1024)
                disconnected = not data...

只select 一个socket连接为什么还要for r in rs:?
s没有准备好还没accept为何要r.recv(1024)?
最开始是只有一个连接的...过后会加入到inputs列表..


QUOTE:
原帖由 luffy.deng 于 2008-11-25 11:11 发表

只select 一个socket连接为什么还要for r in rs:?
s没有准备好还没accept为何要r.recv(1024)?

可能是将所有的连接都放入了inputs列表,但在最初时inputs列表中只有s,因此for一下,在用户刚连接进来时,就append到inputs列表...其它情况下直接读取吧...这是我的理解,不知道对不对!
这么这么冷清?顶上去