gpt4 book ai didi

python - 如何控制python的ThreadPoolExecutor的吞吐速度?

转载 作者:行者123 更新时间:2023-12-01 02:00:54 27 4
gpt4 key购买 nike

我正在使用 python 的 concurrent.futures ThreadPoolExecutor 启动异步任务。正在关注this方法中,我使用 tqdm 进度条监控异步调用的进度。

我的代码如下所示:

with concurrent.futures.ThreadPoolExecutor(max_workers = n_jobs) as executor:
future_to_url = {executor.submit(target_function, URL): URL for URL in URL_list}
kwargs = {'total': len(future_to_url), # For tqdm
'unit': 'URL', # For tqdm
'unit_scale': True, # For tqdm
'leave': False, # For tqdm
'miniters': 50, # For tqdm
'desc': 'Scraping Progress'}
for future in tqdm(concurrent.futures.as_completed(future_to_url), **kwargs):
URL = future_to_url[future]
try:
data = future.result() # Concurrent calls
except Exception as exc:
error_handling() # Handle errors
else:
result_handling() # Handle non-errors

控制台输出如下所示:

Scraping Progress:   9%|▉  | 3.35k/36.2k [08:18<1:21:22, 6.72URL/s] # I want < 6/s
Scraping Progress: 9%|▉ | 3.40k/36.2k [08:26<1:21:16, 6.72URL/s] # I want < 6/s
Scraping Progress: 10%|▉ | 3.45k/36.2k [08:30<1:20:40, 6.76URL/s] # I want < 6/s
Scraping Progress: 10%|▉ | 3.50k/36.2k [08:40<1:20:51, 6.73URL/s] # I want < 6/s
Scraping Progress: 10%|▉ | 3.55k/36.2k [08:46<1:20:36, 6.74URL/s] # I want < 6/s
Scraping Progress: 10%|▉ | 3.60k/36.2k [08:52<1:20:17, 6.76URL/s] # I want < 6/s

我知道我可以设置 URL 队列并控制其大小,如所述 here .

但是,我不知道如何控制吞吐速度本身。假设我想要不超过 6 个 URL/秒。除了在上面的示例中将 time.sleep(n) 放入 target_function() 中之外,还可以通过其他方式来存档吗?

如何有效控制Python中ThreadPoolExecutor吞吐速度concurrent.futures

最佳答案

简短地回答一下,没有这样的方法。声明池后,如果不先关闭池并重新创建它,则无法更改工作人员数量。也没有办法让池向工作线程提供任务的速度低于最大速度。

您有几个(不是最佳的)选择。

一是为worker添加基于全局变量的sleep。然后,您可以使用任务完成回调来测量实际速度并相应地调整变量。但如果 sleep 不成问题,这就没用了。

更好但更麻烦的方法是自己编写任务管理器。在此版本中,您不使用池,而是编写一个管理工作进程的类。您生成“足够”的工作人员,并且工作人员监听队列中的任务。您将从您的经理处以您想要的速度送入此队列。您将队列设置为非常低的最大大小,如果您的管理器检测到队列已满,它会生成另一个工作线程。

但是没有内置功能可以做你想做的事情,这意味着需要做一些工作或者你需要重新设计你的程序,这样你就不会一次性将所有任务送入池中,而是做一些限制那里。

关于python - 如何控制python的ThreadPoolExecutor的吞吐速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49645478/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com