asyncio 怎么与 redis 队列协同?

2018-09-13 17:35:03 +08:00
 867810107

问题描述

我有一个进程会不断地往 redis 队列里增加数据,上限是 5000.然后我想在另一个进程中用 asyncio 从该队列里取出 item,里面有 url 然后请求 api 获得数据。请问我应该怎么控制我的爬取进程每一次只运行一定数目的协程(比如 20 )呢?具体应该怎么写呢?就是怎么从队列获得数据然后发起请求,同时又不能同时运行太多协程。

1991 次点击
所在节点    Python
3 条回复
gaius
2018-09-13 18:03:47 +08:00
单线程定时取 redis,然后丢线程池运行请求 task ?
ifoolish
2018-09-13 21:55:27 +08:00
用 asyncio.Semaphore 控制协程数
kuokyong
2018-09-16 16:20:16 +08:00
第一:需要异步库确保 IO 是异步的 https://github.com/aio-libs/aioredis
第二控制,协程数据和其它多进程 /线程,调度方式类似。一种是提前创建固定数量协程,不断去读数据。 另外就是两个数据建个调度个协程,.create_task/ensure_future. 达到上限就停止,或者用 Semaphore

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/489042

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX