含有章节索引的中文 文章模板 -- dreamingk [DateTime(2004-08-09T01:46:12Z)] TableOfContents
题面
{{{HD hdcola at gmail.com Mon Jul 26 09:30:37 HKT 2004 }}} 这两天在做流的识别与传输,遇到一个小小问题,与大家一起讨论。
另外我将邮件的名命名为[日期][本周代码分析],希望以后我们每周讨论一段有价值的代码,以加深大家对python、twisted、网络开发、开发技巧方面的了解。
我先提出本周的代码分析,是我在twisted中使用时遇到的问题。希望我们这周能分析出它的机制来。 了解清它内部的机理会有利于我们将来的应用。
我在自己的protocol中有如下代码:
在系统运行时间长一点时会发现python报出一个Exception,说是format不一至。
这时仔细考虑了问题的原因是在于对方发送tcp流的速度不快, 导致data中(也就是__buffer中)的数据没有4个字节,这时使用struct.unpack会出现解不出一个I的情况来。
于是,我对代码做了如下改动:
1 def dataReceived(self, data):
2 """ 接收数据报头,判断报文大小,接收报文数据"""
3 self.__buffer = self.__buffer + data
4
5 while len(self.__buffer):
6 trynum = 0
7 while True:
8 try:
9 (length,) = struct.unpack('>I', self.__buffer[:4])
10 break
11 except Exception :
12 print "unpack error"
13 trynum += 1
14 if (trynum > 10):
15 break
呵呵,办法显的不是哪么的巧妙,但是通常10次之内真的能将正确的报头(头四个字节)收下来,以让程序正确的运行下去。但是这个东东让我感觉很是不爽,为什么呢?因为占用太多的cpu,即使加入了sleep,也违反了异步工作的机理。但是这个方法已经让我出现了疑惑,它怎么可能就成功了呢?
self.__buffer = self.__buffer + data 怎么就会让__buffer能在try 10次的过程中加足了四个字节呢?
我非常有兴趣的将代码改了一下,因为我想看看twisted是不是真的会很"神奇":
è¿æ¶æååç°ï¼è¿æ®µä»£ç è¿å¯ä»¥æåè¿è¡ãä¸ä½ä¸ä¸ªå®¢æ·ï%