python的回调地狱
最近要写抢东西的脚本
试着用异步写了一下,使用requests-futures库,
然后我就把代码写成了这样
def DoWork(): def req3Cb(sess,resp): reportSuccess() def req2Cb(sess,resp): # do sth... sess.get(req3, background_callback=req3Cb) def req1Cb(sess,resp): # do sth... sess.get(req2, background_callback=req2Cb) sess.get(req1, background_callback=req1Cb).result()
结果呢,程序每次到req2Cb的时候就会卡住,无法继续执行。
想了好久,突然想起来requests-futures的默认Executor是ThreadPoolExecutor(max_workers=2)
req1的Futures加到Pool中 ,然后req2的Futures也加到了Pool中,这两个Futures占用了Pool的所有worker
接着req3的Futures加到了Pool中,此时Pool中并没有可用的worker,于是req3只好等待执行。
然而 req1 等待 req2完成 ,req2等待req3完成,req3又翻过来等待req1和req2中的任意一个结束,
三个Req的优先级相同,Python的线程池调度又缺乏优先级这种概念,也没有更高级的调度算法。
于是就导致了严重的死锁。
那么解决方案就是以下几种:
1.直接增加max_workers
2.使用async with&await语法
然而最后一看,这个异步写的跟同步完全没有任何区别
那还是直接写成同步吧x