我正在尝试使用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。
有谁能告诉我这里发生的事情?
答案 0 :(得分:0)
您获得的计数是一秒内添加的任务的数量,而不是已完成的任务一秒钟。
如果您只使用一名工作人员,则所有其他任务实际上都存储在队列中。这不会花费任何成本。
但是如果你使用更多的工人,例如10名工人。提交前十个任务时,执行程序将调整活动线程数,这意味着它将逐个创建十个线程。这很昂贵。
要明确的是,当您创建执行程序时,它不会立即创建线程。相反,只有在队列中有任务时才会创建线程。