# 以后我们会尝试使用数据库类解决现在进程之间的数据共享问题
# 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取消息数据