此为利用cpu并行计算的能力,充分利用cpu在循环时并行计算。其实也是受C++并行操作的影响,如果需要C++版,可以移步C++thread并行笔记
一、明确自身cpu可并行的核数
max_workers = os.cpu_count()
二、根据所有任务计算在各个核上平均跑多少任务
use_cpu_pre_task = all_task_size // max_workers
三、最后把任务划分在不同的核上跑
def process_function(range_rask, arg1, arg2):
for i in range(ranges.start, ranges.stop):
XXX
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
for i in range(max_workers):
start_idx = i * use_cpu_pre_task
end_idx = all_task_size if i == max_workers - 1 else (i + 1) * use_cpu_pre_task
range_task = range(start_idx, end_idx)
executor.submit(process_function, range_task, arg1, arg2)
四、拿来主义
import concurrent.futures
def process_function(ranges, 参数1, 参数2):
for i in range(ranges.start, ranges.stop):
XXX
if __name__ == "__main__":
max_workers = os.cpu_count()
all_task_size = 所有任务数量
use_cpu_pre_task = max(all_task_size // max_workers, 1)
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
for i in range(max_workers):
start_idx = i * use_cpu_pre_task
end_idx = all_task_size if i == max_workers - 1 else (i + 1) * use_cpu_pre_task
end_idx = start_idx if start_idx >= all_task_size else end_idx
range_task = range(start_idx, end_idx)
executor.submit(process_function, range_task, 参数1, 参数2)