近期有同事反馈数据后台任务长时间等待,经过排查是爬虫中有一段下载附件和图片的代码导致的,下载任务是遍历执行的,当碰到几十兆的超大附件时,下载时间超长,导致后面的任务一直等待。查明原因有了大致思路,开两个线程去控制,一个线程下载附件,另一个线程计时,当下载附件的线程超过时间就标记任务并continue,遍历执行其他任务,本着不重复造轮子的思想,找了现成的插件——eventlet
eventlet是一个用于python的并发网络库,它使用epoll或libevent实现高度可伸缩的非阻塞i/o。eventlet有个绿色线程(eventlet.green.thread)的概念,可以人为的设置使其互相让渡CPU控制权,我用了一下方法临时解决了超时问题。
eventlet.monkey_patch():在运行时动态修改已有的代码,而不需要修改原始代码
eventlet.Timeout():如果标志为True将立即返回,否则阻塞线程至等待阻塞状态。
示例代码如下:
def timeOutTest():
workDone = False
eventlet.monkey_patch() # 必须加这条代码
with eventlet.Timeout(2, False): # 设置超时时间为2秒
print '这条语句正常执行'
doSomeWork()
print '没有跳过这条输出'
workDone = True
print '跳过了输出'
if workDone:
print "work is done"
else:
print "work is not done"
def doSomeWork():
time.sleep(10)
timeOutTest()
输出结果:
这条语句正常执行 跳过了输出 work is not done



