最近的项目开发中,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) |
实际运行后,总体结果以下:socket
发现持续快一小时,依旧被阻塞,于是须要本身实际设置超时,改用urllib2库,有超时的设置,而后在运行实际程序,发现一旦超时,客户端自动返回函数
于是在实际的编程中,特别是有关网络的操做,须要查明默认的超时状况,并根据本身的须要实际设置本身的超时时间,否则会遭遇意想不到的事情。url