from multiprocessing import Pool, RLock, Value
# 抢占式任务并行设计
# 全局变量,控制迭代过程
lock=RLock()
global_idx=Value('I',0)
task_list = [] # 需要并行的任务list
def task_manager(fake_id):
global lock
lock.acquire()
idx=int(global_idx.value)
global_idx.value += 1
task_id = task_list[idx]
lock.release()
work_fn(task_id) # 并行的work函数
def work_fn(id):
...
def main():
task_list = [1, 2, 3] # example
p = Pool(10)
p.map(task_manager, np.arange(0, len(task_list))
设计抢占式并行的优势是能够有效的从始至终都用上全部的并行资源,而不会出现有些进程已经跑完了,而别的进程还要等半天才能跑完。另外该模式下的并行会按照task_list的任务顺序进行处理,也方便配合进度条等直观显示现在的处理进度。