生成器实现请求队列调度的核心是按需“暂停-恢复”,通过yield懒加载请求参数,配合send()控制节奏、islice分批处理,并与异步执行层解耦,支持状态维护与可重入调度。

用生成器实现请求队列调度,核心是让任务按需“暂停-恢复”,避免一次性加载全部请求,节省内存又便于控制节奏。
生成器作为懒加载的请求源
把待发请求封装成生成器,每次只产出一个请求参数,不提前构造完整列表。适合来源动态(如数据库游标、文件逐行读取)或数量庞大的场景。
- 定义生成器函数,用 yield 逐个返回请求配置(如 URL、method、headers)
- 不调用 next() 或遍历前,生成器不执行也不占内存
- 可配合 itertools.islice 实现分批取数,比如每次取 5 个请求批量处理
用 send() 控制调度节奏
生成器支持双向通信:外部可通过 send() 向内部传入信号(如“继续”、“降速”、“暂停”),内部据此调整 yield 行为。
- 在生成器里用 received = yield request 接收指令
- 根据 received 值决定是否跳过、延迟、或终止下一个 yield
- 例如收到 "wait_1s" 就 time.sleep(1),再 yield 下一个请求
与异步执行层解耦协作
生成器只负责“提供请求”,不关心发送逻辑。实际发起网络请求时,用 asyncio.create_task 或线程池消费生成器产出项。
- 主循环中用 for req in request_gen: 获取请求,再丢给 aiohttp.ClientSession 或 requests.Session
- 可加简单限流:每 yield 一次后 await asyncio.sleep(0.1)
- 异常发生时,生成器可捕获并 yield 错误信息,由上层决定重试或跳过
带状态的可重入调度器
把生成器包装成类,维护当前索引、失败计数、重试策略等状态,支持中断后从中断点继续。
- 类的 __iter__ 返回自身,__next__ 管理 yield 逻辑和状态更新
- 失败时 self.retry_count += 1,达到阈值则 raise StopIteration 或切换备用源
- 支持 reset() 方法清空状态,重新开始调度











