Python 中因urllib2/urlib遭遇的进程阻塞问题

     最近的项目开发中,Gearman中的worker使用Python中的urllib/urllib2库大量抓取网页时,总会出现某个Worker阻塞,偶尔一旦发生worker都被阻塞,就会形成任务大量丢失,为检查缘由所在,为何任务出现中断,就写个脚本,利用strace命令,查看全部woker的快照,发现最终被阻塞在recv函数中,而后程序源代码,发现与网络读取有关的,也就是urllib/urllib2中的相关函数,幸好项目就是监控远程的WEb应用是否活跃,在大量抓取中,已经遭遇不少服务器故意欺骗,于是当时就以为是服务器故意不传用数据,导致worker阻塞,可是阻塞的时间又太长,按理说python中的socket 都应该设置有超时时间,不至于一直不放,为了验证想法,当时就写个简单的服务端程序,接收到数据后,故意不返回任何数据:python

HOST = '172.23.16.42'              编程

PORT = 1024            服务器

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if data:
        print data
        while 1:
            continue
    conn.sendall(data)
conn.close()网络

 

实际运行后,总体结果以下:socket

3bd173d4900e82073682bf3539e2cd68

发现持续快一小时,依旧被阻塞,于是须要本身实际设置超时,改用urllib2库,有超时的设置,而后在运行实际程序,发现一旦超时,客户端自动返回函数

于是在实际的编程中,特别是有关网络的操做,须要查明默认的超时状况,并根据本身的须要实际设置本身的超时时间,否则会遭遇意想不到的事情。url

相关文章
相关标签/搜索