Eventlet 线程不 运行 并行

Eventlet threads do not run in parallel

我写了下面的代码:

import eventlet
import requests
import redis

redis = redis.StrictRedis(host="localhost", port="6379", db=0)

proxy_1_pool = eventlet.GreenPool(40)

def fetch_items():
    for _ in range(0, 400):
        proxy_1_pool.spawn(fetch_listing)

    proxy_1_pool.waitall()

def fetch_listing():
    logger.info("START fetch: " + str(datetime.utcnow()))
    url_info = redis.spop("listings_to_crawl")
    content = make_request(url_info)
    logger.info("END fetch: " + str(datetime.utcnow()))
    if content:
        do_something(content)

def make_request(url_info):
    r = requests.get(url_info)
    return r.content

def main():
    fetch_items()

不幸的是,我看到 fetch_listing 被依次涉及。

它总是打印:

START
END
START 
END

虽然我希望看到:

START
START
END 
END

发生了什么:

  • 您要求 eventlet 同时执行多个 fetch_listing()。与问题标题平行的问题永远不会发生,忘掉它吧。它按照命令执行,您可以通过在 logger.info...START
  • 之后放置 eventlet.sleep() 来验证
  • 然后执行被 redis.spoprequests.get 阻止。

如何使阻塞代码与 eventlet 协作:patching 或卸载到线程池。

-import eventlet
+import eventlet ; eventlet.monkey_patch()

非常相关的问题,强烈推荐阅读: