一、 写此文的缘起
前些日,利用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”)