We are apologize for the inconvenience but you need to download
more modern browser in order to be able to browse our page

Download Safari
Download Safari
Download Chrome
Download Chrome
Download Firefox
Download Firefox
Download IE 10+
Download IE 10+

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