Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中实现多处理?_Python_Sorting_Parallel Processing_Multiprocessing_Python Multiprocessing - Fatal编程技术网

如何在Python中实现多处理?

如何在Python中实现多处理?,python,sorting,parallel-processing,multiprocessing,python-multiprocessing,Python,Sorting,Parallel Processing,Multiprocessing,Python Multiprocessing,我想在Python中使用多处理对独立列表进行排序。 例如,我有一个int作为键的字典和一个list作为值的字典 我试图实现一个简单的程序,但我很难将排序后的列表再次存储在defaultdict中并返回到主模块 from multiprocessing import Process def fun(id, user_data): user_data.sort() return user_data # users_data is a defaultdict of id as ke

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

我试图实现一个简单的程序,但我很难将排序后的列表再次存储在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限制的操作

将多处理导入为mp
def排序列表(用户id、用户数据、进程间目录):
用户_data.sort()
进程间目录[用户id]=用户数据
def prepare_data():
用户_data={}
对于范围(1000)内的i:
用户_数据[i]=列表(范围(10000,0,-1))
返回用户\u数据
def main():
#mp.set_start_方法('spawn')#仅在OSX上有效
进程间dict=mp.Manager().dict()
pool=mp.pool(mp.cpu\u count())
用户\u数据=准备\u数据()
对于用户\ id,用户\数据中的用户\数据。项()
pool.apply\u async(排序\u列表,参数=(用户\u id,用户\u数据,进程间\u dict,)
pool.close()
pool.join()
对于用户标识,进程间目录项()中的用户数据:
打印(“{}:{}.”格式(用户id,用户数据))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

我觉得这可能是因为您的趣味功能输入错误。它应该是return而不是retrun。如果您在启动进程之后等待每个进程,那么使用进程有什么意义?一种更惯用的方法是将流程对象添加到列表中,然后
加入它们,或者更简单地说,使用Thanke@Tomerikoo。是的,join应该与StartHanks分开@anmol,我尝试过这个解决方案,但仍然需要很长时间!我有600个ID,每个ID都有9000个项目的列表,在实现多处理后,我看不到时间有任何增加@加纳我意识到我们可能应该使用
Pool
来实现这一点,因为创建的进程数超过了硬件CPU单元的数量会使速度变慢。顺便说一句,
CPU\u count
Pool
构造函数的默认值,因此它是冗余的。我试图在没有循环的情况下打印整个进程间dict,但它打印的是空dict!,为什么?是因为异步吗?