Python网编_进程间的数据共享

Manager提供了很多数据共享机制,但是对于一些基础数据类型来说,是数据不安全的,那么Q:如何解决呢?   A: 需要我们自己手动加锁
from multiprocessing import Manager,Process,Lock  # Process开子进程用,Lock数据加锁用,Manager进程间数据共享用
def work(d,lock):
    # lock.acquire()
    # d[‘count‘] -= 1
    # lock.release()
    with lock:  # 上下问管理  注意了lock锁的并不是‘count‘这个数据 而是d[‘count‘] -= 1这句代码
        d[‘count‘] -= 1  # 这句之前的上文是lock.acquire()下文是lock.release()

if __name__ == ‘__main__‘:
    lock = Lock()
    m = Manager()  # 实例化一个m
    dic = m.dict({‘count‘:100})  # 调用m的dict方法
    p_l = []
    for i in range(100):
        p = Process(target=work,args=(dic,lock))
        p.start()
        p_l.append(p)
    for p in p_l:
        p.join()
    print(dic)
执行结果:
0
进程间默认是数据隔离的,所以一般不会写数据共享,即使要写,使用队列的数据安全性更好一些,一般不用Manager。

原文地址:https://www.cnblogs.com/gzying-01/p/10375218.html

时间: 2024-10-29 18:51:49

Python网编_进程间的数据共享的相关文章

Python网编_进程之间的数据隔离

写在前面: 控制台的本质是一个文件 文件操作的时候尽量不要用r+ w+ a+ 如果用要小心文件指针混乱 随着进程数量的增多会有一些隐患 from multiprocessing import Process n = 100 # 定义一个全局变量 def func(): global n # 通过global改变n的值 n -= 1 if __name__ == '__main__': lis = [] for i in range(2): # 开启两个进程 p = Process(target=

Python网编_进程对象的其他方法

直接上代码: from multiprocessing import Process import time class MyProcess(Process): def __init__(self,a,b): super().__init__() self.a = a self.b = b def run(self): print('start') time.sleep(0.1) print(self.a,self.b) if __name__ == '__main__': p = MyProc

Python网编_进程池的回调函数

将n个任务交给n个进程去执行每一个进程在执行完毕之后会有一个返回值,这个返回值交给callback函数指定的那个函数去处理这样的话所有的进程哪一个执行的最后快,哪一个就可以先进性统计工作这样就能在最短的时间内得到我们想要的结果 import time import random from multiprocessing import Pool def get(i): # 使用i模拟网站地址 在子进程中执行 time.sleep(random.random()) # 模拟不同的网站返回数据的时间

Python网编_守护进程

假如我有500台机器,跑着500个进程,假如有一部分台机器挂了,我们怎么能及时的知道呢?我们维护自己的机器当然要及时的直到啦so 如果我们有一个监控的软件来实时的监控是不是就可以解决这个问题啦其原理是:client端每隔一个时间段(比如60秒)汇报给server端 没有在正确的时间收到某台机器的汇报就说明这台机器出问题了,应该去看一看.那么如何做呢?在client端的主进程中开启一个子进程,通过这个子进程来汇报,看下面: from multiprocessing import Process i

python全栈开发day33-进程间的通信、进程间的数据共享,进程池

一.昨日内容回顾: 1.  守护进程 1).p.saemon, 2 ).p.terminate 3 ).p.join 2.  同步控制 1).锁,Lock 互斥锁,解决数据安全.进程之间资源抢占问题. 2).信号量,Semaphore 锁+计数器 3).事件,Event 通过一个标志位flag来控制进程的阻塞和执行. 3.  多进程实现tcp协议的socket的sever端 1)子进程中不能使用input 2)允许端口的重用设置 3)妥善处理sk的close确保操作系统的资源能够被及时回收. i

进程间的数据共享、进程池的回调函数和线程初识、守护线程

一.进程的数据共享 进程间数据是独立的,可以借助于队列或管道实现通信,二者都是基于消息传递的 虽然进程间数据独立,但可以通过Manager实现数据共享. 把所有实现了数据共享的比较便捷的类都重新又封装了一遍,并且在原有的multiprocessing基础上增加了新的机制 list dict等 数据共享的机制 支持数据类型非常有限 list dict都不是数据安全的,你需要自己加锁来保证数据安全 Manager用法: Manager().dict() # 创建共享的字典 Manager().lis

进程间的数据共享

# 以后我们会尝试使用数据库类解决现在进程之间的数据共享问题 # multiprocessing.Manager模块,是数据共享用的模块,共享的数据存在数据不安全问题,需要加锁操作 # from multiprocessing import Manager, Process # # # def process1(dic): # dic['count'] = 5 # print('子进程修改了dic') # # # if __name__ == '__main__': # m = Manager(

linux_c开发(5-1)进程间通讯_进程间通讯概念

目的:为什么进程间需要通信? 1.数据传输 一个进程需要将他的数据发送给另外一个进程. 2.资源共享 多进程之间共享同样的资源. 3.通知事件 一个进程需要向另一个或一组进程发送消息,通知他们发生了某种事件. 4.进程控制 有些进程希望完全控制另一个进程的执行(eg:debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道他的状态改变. 发展: linux进程间通讯(IPC)由以下及部分发展而来: 1.UNIX间进程通讯 2.基于system v进程间通讯 3.POSIX进

浅谈Delphi中进程间的数据共享

DLL是创建Windows应用程序,实现代码重用的重要手段.那么当我们需要在进程间共享数据时,怎样做才能快捷方便地实现呢?在32位应用系统中,每个应用程序会将DLL映射到自己的地址空间,同时DLL中的数据也就随之被映射了.这样,每个应用程序都有自己的数据实例,在一个应用程序中修改DLL中的全局变量,不会影响其它的应用程序.DLL的使用似乎与我们的目的相背离,那么如何才能实现我们想要的东东呢?这里给大家介绍一种特殊的技术,那就是内存映射文件. 内存映射文件提供了一种方法,就是在WIN32系统的地址