如何在Python中实现多处理?

时间:2020-07-14 13:18:46

标签: python sorting parallel-processing multiprocessing python-multiprocessing

我想在Python中使用多重处理对独立列表进行排序。
例如,我有一个int字典作为键,一个列表作为值。

我试图实现一个简单的程序,但是我很难将排序后的列表再次存储在defaultdict中并将其返回到主模块中。

from multiprocessing import Process

def fun(id, user_data):
    user_data.sort()
    return user_data

# users_data is a defaultdict of id as key and a list as a value
 
if __name__ == '__main__':
    for id,user_data in users_data.items():
        P= Process(target=fun,args=(id,user_data))
        P.start()
        P.join()    

1 个答案:

答案 0 :(得分:1)

您需要使用Manager在进程之间共享数据。
另外,正如@Tomerikoo在评论中提到的那样,您现在执行的方式实际上不会导致多处理,因为EXPIRE仅在P.join()之后会暂停脚本以使该过程完成,从而导致串行执行流而不是并行执行。

您可以执行以下操作:

P.start()

编辑:

最好将进程数限制为可用的硬件CPU单元数,因为排序列表是100%CPU绑定操作。

from multiprocessing import Process, Manager

def sort_list(user_id, user_data, interprocess_dict):
    user_data.sort()
    interprocess_dict[user_id] = user_data


users_data = {}
users_data[1] = [5, 2, 1]
users_data[3] = [10, 12, 1]


def main():
    interprocess_dict = Manager().dict()
    processes = []
    for user_id, user_data in users_data.items():
        proc = Process(target=sort_list, args=(user_id, user_data, interprocess_dict,))
        processes.append(proc)
        proc.start()

    for proc in processes:
        proc.join()
    
    for user_id, user_data in interprocess_dict.items():
        print('{}: {}'.format(user_id, user_data))


if __name__ == '__main__':
    main()