Eventlet线程不会并行运行

时间:2017-11-26 18:42:08

标签: python multithreading concurrency proxy eventlet

我写了以下代码:

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

1 个答案:

答案 0 :(得分:1)

发生了什么:

  • 您要求eventlet同时执行多个fetch_listing()。并行的问题标题不会发生,忘了它。它按照订单执行,您可以在eventlet.sleep()
  • 之后立即logger.info...START进行验证
  • 然后执行被redis.spoprequests.get阻止。

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

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

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