簡體   English   中英

如何在 Python 中實現多處理?

[英]How to implement multiprocessing in Python?

我想在 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()    

您需要使用 Manager 在進程之間共享數據。
此外,正如@Tomerikoo 在評論中提到的那樣,您現在執行的方式實際上不會導致多處理,因為P.join()P.start()之后腳本會暫停以讓該過程完成,從而導致串行執行流程而不是並行。

你可以這樣做:

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()

編輯:

最好將進程數限制為可用的硬件 CPU 單元數,因為對列表進行排序是 100% CPU 綁定操作。

import multiprocessing as mp


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


def prepare_data():
    users_data = {}
    for i in range(1000):
        users_data[i] = list(range(10000, 0, -1))
    return users_data


def main():
    # mp.set_start_method('spawn') # Only valid on OSX
    interprocess_dict = mp.Manager().dict()
    pool = mp.Pool(mp.cpu_count())
    users_data = prepare_data()
    for user_id, user_data in users_data.items():
        pool.apply_async(sort_list, args = (user_id, user_data, interprocess_dict,))
    pool.close()
    pool.join()
    for user_id, user_data in interprocess_dict.items():
        print('{}: {}'.format(user_id, user_data))


if __name__ == '__main__':
    main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM