Python ThreadPoolExecutor执行时每完成10个任务自动加延迟的实现方法
解决方案
以下两种实现方式都不需要修改parse任务函数的代码,即可实现每完成10个任务自动休眠指定时长的需求:
方案1:分批提交任务(推荐,适配你设置的max_workers=10参数)
将总任务列表按每10个拆分为一个批次,每跑完一个批次就休眠指定时长,逻辑简单可控:
import time from concurrent.futures import ThreadPoolExecutor user_list = [i for i in range(1, 101)] X = 3 # 自定义休眠的秒数 def parse(user): return str(user) + "parsed!" # 按每10个元素拆分列表为批次 user_chunks = [user_list[i:i+10] for i in range(0, len(user_list), 10)] output = [] start = time.time() with ThreadPoolExecutor(max_workers=10) as exe: for idx, chunk in enumerate(user_chunks): # 执行当前批次的10个任务 chunk_result = exe.map(parse, chunk) output.extend(list(chunk_result)) # 非最后一批的情况下执行休眠,如果需要最后10个跑完也休眠,可删除if判断 if idx != len(user_chunks) - 1: time.sleep(X) end = time.time() print('taken time', end-start)
该方案刚好匹配你设置的10个并发线程数,每批次10个任务并行跑完后才会触发休眠,完全符合需求。
方案2:完成量计数触发休眠(无需拆分列表)
利用ThreadPoolExecutor.map返回结果的迭代特性,每获取到1个完成的任务结果就计数,累计到10的倍数时触发休眠:
import time from concurrent.futures import ThreadPoolExecutor user_list = [i for i in range(1, 101)] X = 3 # 自定义休眠的秒数 def parse(user): return str(user) + "parsed!" output = [] count = 0 start = time.time() with ThreadPoolExecutor(max_workers=10) as exe: result = exe.map(parse, user_list) for res in result: output.append(res) count += 1 if count % 10 == 0: time.sleep(X) end = time.time() print('taken time', end-start)
该方案不需要拆分任务列表,适合任务执行耗时差异小的场景,休眠逻辑会严格按照每完成10个任务触发。
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

