Python多线程场景下为每次循环迭代添加延迟的最优方案是什么
问题答疑
直接在循环前添加sleep是否可行?
不可行。executor.map调用后会立刻按配置的max_workers=5并发度批量提交所有上传任务,等代码执行到遍历results的循环位置时,所有请求早就已经发送完成,此时无论是在循环前还是循环内加sleep,都无法限制请求发送频率,刚提交的前5个请求就会直接触发限流规则。
最优实现方式
推荐按批次提交任务,严格匹配每分钟最多5次的限流规则,具体逻辑为:将待上传数据按每5条分为1个批次,每批次提交5个上传任务,等待该批次全部执行完成后,休眠1分钟再提交下一批次,既不会触发限流,也能最大化利用限流配额。
示例代码如下:
import concurrent.futures import time import math upload_tasks = df.to_dict('records') batch_size = 5 # 匹配每分钟最多5次的限流阈值 sleep_interval = 60 t = [] # 计算总批次数量 total_batch = math.ceil(len(upload_tasks) / batch_size) for batch_idx in range(total_batch): # 切分当前批次的待上传数据 current_batch = upload_tasks[batch_idx * batch_size : (batch_idx + 1) * batch_size] # 提交当前批次的任务 with concurrent.futures.ThreadPoolExecutor(max_workers=batch_size) as executor: for result in executor.map(upload, current_batch): t.append(result) # 最后一个批次执行完成后无需额外等待 if batch_idx < total_batch - 1: time.sleep(sleep_interval)
内容的提问来源于stack exchange,提问作者Round
相关产品推荐
相关产品推荐

