免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5280 | 回复: 4
打印 上一主题 下一主题

【关于python的异步通信(IO复用)问题】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-25 08:44 |只看该作者 |倒序浏览
【背景】有一位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 =
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实在困惑太多,多谢了!

论坛徽章:
0
2 [报告]
发表于 2008-11-25 11:11 |只看该作者
原帖由 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)?

论坛徽章:
0
3 [报告]
发表于 2008-11-25 11:41 |只看该作者
最开始是只有一个连接的...过后会加入到inputs列表..

论坛徽章:
0
4 [报告]
发表于 2008-11-25 11:46 |只看该作者
原帖由 luffy.deng 于 2008-11-25 11:11 发表

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



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

论坛徽章:
0
5 [报告]
发表于 2008-11-26 12:34 |只看该作者
这么这么冷清?顶上去
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP