如何在Python中实现多处理?
我想在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
例如,我有一个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!,为什么?是因为异步吗?