我一直在通过划分范围来达到这个目的。
这是一个有效的例子。在from time import time, strftime, sleep, gmtime
from random import randint
from itertools import islice
from concurrent.futures import ThreadPoolExecutor, as_completed
def nap(id, nap_length):
sleep(nap_length)
return nap_length
def chunked_iterable(iterable, chunk_size):
it = iter(iterable)
while True:
chunk = tuple(islice(it, chunk_size))
if not chunk:
break
yield chunk
if __name__ == '__main__':
startTime = time()
range_size = 10000000
chunk_size = 10
nap_time = 2
# Iterate in chunks.
# This consumes less memory and kicks back initial results sooner.
for chunk in chunked_iterable(range(range_size), chunk_size):
with ThreadPoolExecutor(max_workers=chunk_size) as pool_executor:
pool = {}
for i in chunk:
function_call = pool_executor.submit(nap, i, nap_time)
pool[function_call] = i
for completed_function in as_completed(pool):
result = completed_function.result()
i = pool[completed_function]
print('{} completed @ {} and slept for {}'.format(
str(i + 1).zfill(4),
strftime("%H:%M:%S", gmtime()),
result))
print('== - Script took {} seconds. -=='.format(
round(time() - startTime)))
这种方法的缺点是块是同步的。在将下一个块添加到池之前,必须完成块中的所有线程。在