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.spop
和 requests.get
阻止。
如何使阻塞代码与 eventlet 协作:patching 或卸载到线程池。
-import eventlet
+import eventlet ; eventlet.monkey_patch()
非常相关的问题,强烈推荐阅读:
我写了下面的代码:
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
之后放置 - 然后执行被
redis.spop
和requests.get
阻止。
eventlet.sleep()
来验证
如何使阻塞代码与 eventlet 协作:patching 或卸载到线程池。
-import eventlet
+import eventlet ; eventlet.monkey_patch()
非常相关的问题,强烈推荐阅读: