python线程池的奇怪行为

时间:2018-04-20 01:43:51

标签: python concurrency threadpool threadpoolexecutor

我正在尝试使用python的threadpool

concurrent.futures.ThreadPoolExecutor

我正在进行api调用,我想使用threadpool executor

并行化它

异步运行api调用1秒

executor = ThreadPoolExecutor(max_workers=10)

initial_start_time = time.time()
count = 0

while True:
    start_time = time.time()
    future = executor.submit(api_call_func)
    end_time = time.time()

    if ((end_time-initial_start_time) > 1):
        break;
    count = count+1
    list.append(future)
print(count)

现在,当我将max_workers中定义的工作人员数量从1更改为10.计数开始减少。

1 - 10K
5 - 1K
10 - 608

因此,使用更多员工实际上会损害绩效。为什么会这样?我知道python一次只使用一个线程。但是,由于api调用是IO绑定的,这应该有所帮助。

单个rpc api调用大约需要5毫秒。它就像没有处理的最小api。

有谁能告诉我这里发生的事情?

1 个答案:

答案 0 :(得分:0)

嗯......我无法理解你的结构。您正在测试添加任务的性能,但不测试正在运行的任务的性能。

您获得的计数是一秒内添加的任务的数量,而不是已完成的任务一秒钟。

如果您只使用一名工作人员,则所有其他任务实际上都存储在队列中。这不会花费任何成本。

但是如果你使用更多的工人,例如10名工人。提交前十个任务时,执行程序将调整活动线程数,这意味着它将逐个创建十个线程。这很昂贵。

要明确的是,当您创建执行程序时,它不会立即创建线程。相反,只有在队列中有任务时才会创建线程。