亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Python 中實現多處理?

如何在 Python 中實現多處理?

MM們 2023-03-08 10:15:36
我想在 Python 中使用多處理來對獨立列表進行排序。例如,我有一個 int 字典作為鍵,一個列表作為值。我試圖實現一個簡單的程序,但我很難將排序后的列表再次存儲在 defaultdict 中并將其返回給主模塊。from multiprocessing import Processdef 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 回答

?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

您需要使用管理器在進程之間共享數據。

此外,正如@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()


查看完整回答
反對 回復 2023-03-08
  • 1 回答
  • 0 關注
  • 79 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號