博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 中因urllib2/urlib遭遇的进程阻塞问题
阅读量:6815 次
发布时间:2019-06-26

本文共 837 字,大约阅读时间需要 2 分钟。

hot3.png

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

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()

 

实际运行后,整体结果如下:

发现持续快一小时,依旧被阻塞,因而需要自己实际设置超时,改用urllib2库,有超时的设置,然后在运行实际程序,发现一旦超时,客户端自动返回

因而在实际的编程中,特别是有关网络的操作,需要查明默认的超时情况,并根据自己的需要实际设置自己的超时时间,不然会遭遇意想不到的事情。

转载于:https://my.oschina.net/u/586648/blog/84006

你可能感兴趣的文章
病毒木马防御与分析实战
查看>>
分布式工作流任务调度系统Easy Scheduler正式开源
查看>>
Flutter实战(一)写一个天气查询的APP
查看>>
Python零基础学习笔记(十二)—— 字符串及其常用方法
查看>>
Webpack 和 Gulp 构建伪命令行项目
查看>>
在线面试, 前端, 提纲, 草稿
查看>>
hive_异常_01_ Terminal initialization failed; falling back to unsupported
查看>>
分布式事务键值数据库 TiKV 加入 CNCF 沙箱孵化器
查看>>
Vue - day1
查看>>
kvm.virsh常用命令篇
查看>>
[Hive]Hive使用指南四 客户端导入数据
查看>>
10.JUC线程高级-线程八锁
查看>>
Apache Flink轻量级异步快照机制源码分析
查看>>
PostgreSQL 11 preview - 分区表 增强 汇总
查看>>
MediaCodec在Android视频硬解码组件的应用
查看>>
用JAVA自己画一张二维码
查看>>
Flutter Engine线程管理与Dart Isolate机制
查看>>
美国泛达公司:下一代数据中心的光缆布线系统
查看>>
以太坊(ethereum)技术开发相关资料
查看>>
Pandas数据排序
查看>>