进程间的数据共享

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

# 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

进程间的数据共享的相关文章

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

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: # 上下问管理 注意了l

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

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

进程间实现数据共享的三种方式

1.Queue: -linux: q = multiprocessing.Queue() def task(arg,q): q.put(arg) def run(): for i in range(10): p = multiprocessing.Process(target=task, args=(i, q,)) p.start() while True: v = q.get() print(v) run() -windows: import multiprocessing def task(

Perl进程间数据共享

本文介绍的Perl进程间数据共享内容主体来自于<Pro Perl>的第21章. IPC简介 通过fork创建多个子进程时,进程间的数据共享是个大问题,要么建立一个进程间通信的通道,要么找到一个两进程都引用的共享变量.本文将介绍Unix IPC的近亲System V IPC:message queues(消息队列).semaphores(信号量)和shared memory-segments(共享内存段).它们都是IPC结构,它们被非常广泛地应用于进程间通信.它们的帮助文档可参见: $ perl

Python之路(第三十九篇)管道、进程间数据共享Manager

一.管道 概念 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 先画一幅图帮助大家理解下管道的基本原理 现有2个进程A和B,他们都在内存中开辟了空间,那么我们在内存中再开辟一个空间C,作用是连接这两个进程的.对于进程来说内存空间是可以共享的(任何一个进程都可以使用内存,内存当中的空间是用地址来标记的,我们通过查找某一个地址就能找到这个内存)A进程可以不断的向C空间输送东西,B进程可以不断的从C空间读取东西,这

11.python并发入门(part10 多进程之间实现通信,以及进程之间的数据共享)

一.进程队列. 多个进程去操作一个队列中的数据,外观上看起来一个进程队列,只是一个队列而已,单实际上,你开了多少个进程,这些进程一旦去使用这个队列,那么这个队列就会被复制多少份. (队列=管道+锁) 这么做的主要原因就是,不同进程之间的数据是无法共享的. 下面是使用进程队列使多进程之间互相通信的示例: 下面这个例子,就是往进程队列里面put内容. #!/usr/local/bin/python2.7 # -*- coding:utf-8 -*- import multiprocessing de

Windows进程间各种通信方式浅谈

1 Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成. 多进程/多线程是Windows操作系统的一个基本特征.Microsoft Win32应用编程接口(Application Programming Interface, API) 提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC), 进程通信就