ITPub博客

首页 > 数据库 > 数据库开发技术 > python 多进程间相互协调: Manager共享变量(数据共享)

python 多进程间相互协调: Manager共享变量(数据共享)

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-05-07 17:00:29 0 删除 编辑

multiprocessing 多进程之间相互协调的方式有如下几种:

  • Lock:锁,
  • Semaphore:信号量
  • Queue:队列,
  • Event:事件
  • Pipe:管道

在多进程方式并发编程中,

  • 如果我们实在无法避免进行数据共享的话(通常应该会尽量避免使用共享数据的方式进行通讯)应尽可能使用消息传递和队列,这样我们可以避免处理复杂的同步和锁问题,

Manager类共享变量方式的进程间同步通信

  • 进程拥有自己独占的虚拟地址空间(操作系统对主存一种抽象概念,每个进程只能访问自己的地址空间)。如果使用常规那种共享变量的方式是无法完成相关进程之间的共享通信。除了使用:multiprocess包中封装了进程间共享数据的三个类
  • Value
  • Array
  • Manager

三者之间的区别主要在于管理的数据类型不同。

manager支持的类型:

  • Value
  • Array
  • list
  • dict
  • Queue
  • Lock
  • ····

manager下的dict示例:

from multiprocessing import Process, Manager
import os
import time

def jincheng1(dict):
    print("子进程id:%s" % (os.getpid()))
    time.sleep(1)
    dict[os.getpid()] = "我子进程:"+str(os.getpid())
    print("子进程id:%s下的dict内容:" % (os.getpid()),dict)

def jincheng2(dict):
    print("子进程id:%s" % (os.getpid()))
    time.sleep(1)
    dict[os.getpid()] = "我子进程:"+str(os.getpid())
    print("子进程id:%s下的dict内容:" % (os.getpid()),dict)


if __name__ == '__main__':
    start = time.time()
    index = 0

    manager = Manager()
    mDict = manager.dict()

    ps_1 = Process(target=jincheng1, args=(mDict,))
    ps_1.start()
    ps_1.join()
    ps_2 = Process(target=jincheng2, args=(mDict,))
    ps_2.start()
    ps_2.join()

    print('字典里面的最终结果:')
    for key in dict(mDict):
        print("%s=%s" % (key, mDict[key]))
    print('主进程运行时间:%s'%(time.time()-start))

输出结果:

D:\ceshi>python jincheng6.py
子进程id:40568
子进程id:40568下的dict内容: {40568: '我子进程:40568'}
子进程id:4912
子进程id:4912下的dict内容: {40568: '我子进程:40568', 4912: '我子进程:4912'}
字典里面的最终结果:
40568=我子进程:40568
4912=我子进程:4912
主进程运行时间:2.821425676345825

个人其他博客地址

简书:https://www.jianshu.com/u/d6960089b087

掘金:https://juejin.cn/user/2963939079225608

小钟同学 | 文 【原创】| QQ:308711822

  • 1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。
  • 2:关于文章内容,有部分内容参考自互联网整理,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111765