zoukankan      html  css  js  c++  java
  • 进程间数据共享 (multiprocess.Manager)

    进程间数据共享 (multiprocess.Manager)

    一、进程之间的数据共享

    展望未来,基于消息传递的并发编程是大势所趋

    即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据。

    这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分布式系统中。

    但进程间应该尽量避免通信,即便需要通信,也应该选择进程安全的工具来避免加锁带来的问题。

    以后我们会尝试使用数据库来解决现在进程之间的数据共享问题。

    1.1 Manager模块介绍

    进程间数据是独立的,可以借助于队列或管道实现通信,二者都是基于消息传递的。

    虽然进程间数据独立,但可以通过Manager实现数据共享,事实上Manager的功能远不止于此。

    A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.

    A manager returned by Manager() will support types list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array.

    1.2 Manager例子

    from multiprocessing import Manager,Process,Lock
    def work(d,lock):
        with lock:  # 不加锁而操作共享的数据,肯定会出现数据错乱
            d['count']-=1
    
    if __name__ == '__main__':
        lock=Lock()
        with Manager() as m:
            dic=m.dict({'count':100})
            p_l=[]
            for i in range(100):
                p=Process(target=work,args=(dic,lock))
                p_l.append(p)
                p.start()
            for p in p_l:
                p.join()
            print(dic)
    

    {'count': 0}

    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    NOI2010 超级钢琴
    [linux][nginx] 常用2
    [linux][nginx] 常用
    [PHP]听说随机数mt_rand()比rand()速度快,闲的无聊测试了一下!
    [linux] 权限问题
    [Laravel] 自带分页实现以及links方法不存在错误
    [YII2] 去除自带js,加载自己的JS,然后ajax(json)传值接值!
    [PHP]PHP设计模式:单例模式
    [html]浏览器标签小图标LOGO简单设置
    [javascript]JS获取当前时间戳的方法
  • 原文地址:https://www.cnblogs.com/randysun/p/11529179.html
Copyright © 2011-2022 走看看