免费注册 查看新帖 |

Chinaunix

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

菜鸟发问:学习异步IO是遇到的一个问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-15 15:10 |只看该作者 |倒序浏览
小弟在学习看Python基础教程 异步IO poll的时候遇到一个问题,
书中例子是这样的:
  1. import socket,select

  2. s=socket.socket()
  3. host=socket.gethostname()
  4. port=1234
  5. s.bind((host,port))

  6. fdmap={s.fileno():s}

  7. s.listen(5)
  8. p=select.poll()
  9. p.register(s)
  10. while True:
  11.     events=p.poll()
  12.     for fd,event in events:
  13.         if fd in fdmap:
  14.             c,addr=s.accept()
  15.              print 'Got connection'
  16.              p.register(c)
  17.              fdmap[c.fileno]=c
  18.          elif event & select.POLLIN:
  19.              data=fdmap[fd].recv(1024)
  20.              if not data:
  21.                   print 'disconnect'
  22.                   p.unregister(fd)
  23.                   del fdmap[fd]
  24.          else:
  25.                   print data     
复制代码
我的问题是, 当有一个连接进来的时候, p也把c注册了,并且映射到了fdmap中,那么在下一个循环中,如果c这个socket来了数据,而且c也在fdmap中,那么这个程序岂不又进入
if fd in fdmap: 这个分支中了而不会进入 elif event &select.POLLIN这个分支?这个例子写得有错误吧。应该改成 if fd is s,对吗?

论坛徽章:
0
2 [报告]
发表于 2012-02-15 15:27 |只看该作者
经过测试,确实是例子写错了,应该是 if fdmap[fd] is s ,并且最后一个 else应该再退一格。

论坛徽章:
0
3 [报告]
发表于 2012-02-16 15:26 |只看该作者
本帖最后由 askandstudy 于 2012-02-16 15:27 编辑
snan4love 发表于 2012-02-15 15:27
经过测试,确实是例子写错了,应该是 if fdmap[fd] is s ,并且最后一个 else应该再退一格。


貌似是if fdmap[fd] is s,但那个else不用退了,经测试。

http://python.codefetch.com/example/p7/Chapter14/poll_server.py?qy=tname
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP