# 以后我们会尝试使用数据库类解决现在进程之间的数据共享问题 # multiprocessing.Manager模块,是数据共享用的模块,共享的数据存在数据不安全问题,需要加锁操作 # from multiprocessing import Manager, Process # # # def process1(dic): # dic[‘count‘] = 5 # print(‘子进程修改了dic‘) # # # if __name__ == ‘__main__‘: # m = Manager() # 创建了一个数据共享的载体 # dic = m.dict({‘count‘:100}) # 用这个数据共享的载体创建了一个具有进程间数据共享的字典 # print(‘主进程的‘, dic) # {‘count‘: 100} # p = Process(target=process1, args=(dic, )) # p .start() # p.join() # print(‘主进程的‘, dic) # {‘count‘: 5} # # 多个进程同时修改数据共享的那个数据时,会出现数据不安全性 # # 下面的例子就是模拟多个进程同时修改一个数据共享的的数据,造成数据不安全的问题,解决办法是加锁 # # from multiprocessing import Manager, Process # # # def process1(dic): # dic[‘count‘] -= 1 # #print(‘子进程修改了dic‘) # # # if __name__ == ‘__main__‘: # m = Manager() # 创建了一个数据共享的载体 # dic = m.dict({‘count‘:100}) # 用这个数据共享的载体创建了一个具有进程间数据共享的字典 # p_lst = [] # print(‘主进程的‘, dic) # {‘count‘: 100} # for i in range(50): # p = Process(target=process1, args=(dic, )) # p .start() # p_lst.append(p) # for i in p_lst: # i.join() # print(‘主进程的‘, dic) # 可能是{‘count‘: 50},也可能是主进程的 {‘count‘: 不定值} # 多个进程同时修改数据共享的那个数据时,会出现数据不安全性, 解决办法是加锁 from multiprocessing import Manager, Process, Lock def process1(dic, lock): lock.acquire() dic[‘count‘] -= 1 lock.release() #print(‘子进程修改了dic‘) if __name__ == ‘__main__‘: lock = Lock() m = Manager() # 创建了一个数据共享的载体 dic = m.dict({‘count‘:100}) # 用这个数据共享的载体创建了一个具有进程间数据共享的字典 p_lst = [] print(‘主进程的‘, dic) # {‘count‘: 100} for i in range(50): p = Process(target=process1, args=(dic, lock)) p .start() p_lst.append(p) for i in p_lst: i.join() print(‘主进程的‘, dic) # 可能是{‘count‘: 50},也可能是主进程的 {‘count‘: 不定值} # 实际上用的多的还是multiprocessing.Queue # 但是Queue只能实现一个Python代码启动的进程子进程之间的互相使用 # 而kafak(大数据的消息中间件)、rebbitmq、memcache这些个消息中间件,可以实现跨电脑、跨代码的进程间通信 # 比如一台服务器上装了一个memcache,一台电脑上的代码可以给这个memcache传递消息,另一台电脑上的代码可以从这个memcache取消息数据
原文地址:https://www.cnblogs.com/whylinux/p/9825168.html
时间: 2024-11-09 03:48:22