关于python的twisted库的getpage函数

一、 写此文的缘起      

前些日,利用python的twisted网络编程框架搭建了一个小的多客户模拟器。其中涉及最多的函数就是twisted.web.client中的getPage函数。通过getPage(url).addCallback(suc).addErrback(err),可以通过suc函数和err函数分别处理获得网页成功以及失败的情况。同时,我还设置了一个全局变量Cnt, 初始值为0. 在执行getPage函数前,执行Cnt += 1;在suc以及err中,分别执行Cnt -= 1。

def suc(data) :

Cnt -= 1

……

def err(data):

Cnt -= 1

……

起初我认为,Cnt的值必为0或1,不会有其它的情况,因为getPage前,Cnt += 1, 此时Cnt == 1;

随后在回调函数中,不论成功或失败,均有Cnt -= 1,此时Cnt == 0。然而在实际的运行中,我发现,

Cnt可以取到-1,-2,-3.。。。等值。难道suc以及err执行了多次?随后,我进行实验,发现: getPage

成功后,程序进入suc,可是如果在suc中遇到了某种异常,程序又跳到err中运行。于是Cnt -= 1就被执行了

多次。解决这个问题的一种方法如下:

def suc(data) :

……

Cnt -= 1

def err(data):

……

Cnt -= 1

如上,将对全局变量的赋值放在末尾。如果函数体在执行中遇到了问题,即使跳转到其它回调函数,

Cnt -= 1 依然仅仅执行一次。

二、getPage方法的一些参数

1.    超时设置

当getPage在一段时间内没有获取到有效数据后,我们希望终止连接(假设超时时间为10s)。这就用到了下边的方法。

client.getPage(url, timeout=10)

2.   设置HTTP请求的头中的字段User-Agent。

client.getPage(url, agent=”xxxxx_agent_name”)