主控程序虽然比较长,但也很简单。这里主要提几个地方。
拿到generator之后,第一次只能send一个None,或者调用next。如果你想把接口做得友好一点,可以参考 PEP342 的consumer函数。这是一个decorator,可以返回一个能直接 send消息的generator。
connPool和msgQueue是必不可少的。对于读,我们可以不用list。因为不管哪种协议,每次循环的时候,每个socket只会读一次。但是写必须要用list。因为在有些协议里,比方说IM,很可能会出现一次循环里有多个pseudo-thread要往同一个socket里面写东西的情况。这时你就必须用list保存数据了。
这一点不是generator的东西。第39行,我们设了sock的timeout,因此47行的时候, sock就不会傻等下去了。此外,第56行,select的SOCK_TIMEOUT也很重要。如果你不给 timeout值,那么select就block了。第一次循环的时候,sock.accept很可能没听到连接,因此conns是空的。而select要等至少有一个socket能读写才会退出。于是程序就死了。这里你也可以指定timeout为0。这样就变成poll了。
coroutine本质上还是单线程。读者可以这样修改程序:
31 while val:
32 val = val.strip()
33 val = yield ( ">>> " + val + '\r\n')
--> if username == 'shhgs' :
--> sleep(30)
你会发现,如果shhgs输入了东西,EchoServer就会停上一段时间。从这也能看出, coroutine从本质上讲还是单线程的。所以,我们再强调一遍。使用coroutine之前,先想好了你的任务是不是适合用coroutine解决。
shhgs 回复于:2006-09-01 11:15:05
http://www.woodpecker.org.cn/share/doc/Python/_html/Py2.5yield.note/060831.yield.note.html
Northland 回复于:2006-09-01 11:31:59
谢谢Shhgs! 以后有问题多向你请教
ghostwwl 回复于:2006-09-11 13:38:18
顶起来 嘿嘿
liaoliao4484 回复于:2006-09-26 08:34:13
谢谢,从中收益了
jessinio 回复于:2007-01-07 22:19:24
为什么对CSDN这些反感??我觉得csdn的python板不错呀
crquan 回复于:2007-01-25 14:45:57
既然允许转载,禁止匿名查看应该不是你的本意吧。
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | generator 任务 一个 yield 合作 可以 coroutine 我们 |
注册
个人空间
