如何控制python的吞吐量速度';谁是执行者?

如何控制python的吞吐量速度';谁是执行者?,python,python-2.7,python-multithreading,concurrent.futures,Python,Python 2.7,Python Multithreading,Concurrent.futures,我正在使用python的concurrent.futures启动异步任务。 按照这种方法,我使用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 =

我正在使用python的
concurrent.futures
启动异步任务。 按照这种方法,我使用
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
控制台输出如下所示:

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

刮片进度:9%|▉  | 3.35k/36.2k[08:18简而言之,没有这样的方法。一旦你声明了你的池,你不能在不先关闭池并重新创建它的情况下更改工作线程的数量。也没有方法使池馈送任务慢于工作线程的最大速度

你有几个(不是很理想的)选择

一种是将基于全局变量的睡眠添加到worker中。然后您可以使用任务完成的回调来测量实际速度并相应地调整变量。但是如果睡眠是不可能的,那么这就不起作用了

更好的方法(尽管更繁重)是自己编写任务管理器。在这个版本中,您不使用池,而是编写一个管理工作进程的类。您生成的“足够多”工人,工人监听队列中的任务。您将以所需的速度从经理处输入此队列。您将队列设置为非常小的最大大小,如果经理检测到队列已满,则会生成另一个工人


但是没有内置的功能来做你想做的事情,这意味着需要做一些工作,或者你需要重新设计你的程序,这样你就不会一下子把所有的任务都输入到池中,而是在池中进行一些限制。

这不可能是精确的,但是你可以减少
max\u workers
。我不想对有多少个workers会被删除进行基准测试加快速度-特别是wifi质量也会影响这一点。我想要Java的可变线程选项、最小线程数、最大线程数等。你的意思是什么?
max_workers
精确地控制最大线程数。很抱歉我的精度不够。我希望某些实例能够以流畅的方式控制工作线程数因此,它将被调整为每秒约6个URL,基本上我需要“max_workers=fluent”功能,但不知道如何实现这一点