阅 读 文 章

Py 2.5 what's new 之 yield(灰衣人)

[来源:网上转载 (http://www.chinaunix.net) | 作者:网友(xichen) | 时间:2007-05-27 | 浏览:人次 ]



主控程序虽然比较长,但也很简单。这里主要提几个地方。

拿到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 我们

最新评论 共有0位网友发表了评论

发表评论

评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名:(注册)
密码:
验证码:
匿名发表

网站地图友情连接交流论坛网站投稿广告服务联系我们留言本站长统计
Some rights reserved: www.chmhome.com, 鄂ICP备07010232号 E-mail:chinakafei@live.com,QQ:552766
中国咖啡技术网(Chmhome):国外编程技术书籍,中文编程手册,经典编程文章,交流技术,技术软件下载,计算机论文,毕业论文.