我有一个进程会不断地往 redis 队列里增加数据,上限是 5000.然后我想在另一个进程中用 asyncio 从该队列里取出 item,里面有 url 然后请求 api 获得数据。请问我应该怎么控制我的爬取进程每一次只运行一定数目的协程(比如 20 )呢?具体应该怎么写呢?就是怎么从队列获得数据然后发起请求,同时又不能同时运行太多协程。
1
gaius 2018-09-13 18:03:47 +08:00
单线程定时取 redis,然后丢线程池运行请求 task ?
|
2
ifoolish 2018-09-13 21:55:27 +08:00 via iPhone
用 asyncio.Semaphore 控制协程数
|
3
kuokyong 2018-09-16 16:20:16 +08:00
第一:需要异步库确保 IO 是异步的 https://github.com/aio-libs/aioredis
第二控制,协程数据和其它多进程 /线程,调度方式类似。一种是提前创建固定数量协程,不断去读数据。 另外就是两个数据建个调度个协程,.create_task/ensure_future. 达到上限就停止,或者用 Semaphore |