进程---管道、数据共享Manager、进程池和回调函数(重要)(六)

#   管道

from multiprocessing import Pipe,Process

def func(conn1,conn2):    conn2.close()   #子进程只关闭conn2时会抛出一个EOFError(没数据可取时recv),根据EOFError结束循环    while True:        try :            msg = conn1.recv()#不判断话会阻塞            print(msg)        except EOFError:            conn1.close()            break

if __name__ == ‘__main__‘:    conn1, conn2 = Pipe()    Process(target=func,args = (conn1,conn2)).start()    conn1.close()    for i in range(20):        conn2.send(‘吃了么‘)    conn2.close()  #主进程Conn1和Conn2全部关闭,不会影响子进程的Conn1和Conn2

管道实现生产者消费者模型

# from multiprocessing import Lock,Pipe,Process# def producer(con,pro,name,food):#     con.close()#     for i in range(100):#         f = ‘%s生产%s%s‘%(name,food,i)#         print(f)#         pro.send(f)#     pro.send(None)#     pro.send(None)#     pro.send(None)#     pro.close()## def consumer(con,pro,name,lock):#     pro.close()#     while True:#             lock.acquire()#             food = con.recv()#             lock.release()#             if food is None:#                 con.close()#                 break#             print(‘%s吃了%s‘ % (name, food))# if __name__ == ‘__main__‘:#     con,pro = Pipe()#     lock= Lock()#     p = Process(target=producer,args=(con,pro,‘egon‘,‘泔水‘))#     c1 = Process(target=consumer, args=(con, pro, ‘alex‘,lock))#     c2 = Process(target=consumer, args=(con, pro, ‘bossjin‘,lock))#     c3 = Process(target=consumer, args=(con, pro, ‘wusir‘,lock))#     c1.start()#     c2.start()#     c3.start()#     p.start()#     con.close()#     pro.close()

# from multiprocessing import Process,Pipe,Lock## def consumer(produce, consume,name,lock):#     produce.close()#     while True:#         lock.acquire()#         baozi=consume.recv()#         lock.release()#         if baozi:#             print(‘%s 收到包子:%s‘ %(name,baozi))#         else:#             consume.close()#             break## def producer(produce, consume,n):#     consume.close()#     for i in range(n):#         produce.send(i)#     produce.send(None)#     produce.send(None)#     produce.close()## if __name__ == ‘__main__‘:#     produce,consume=Pipe()#     lock = Lock()#     c1=Process(target=consumer,args=(produce,consume,‘c1‘,lock))#     c2=Process(target=consumer,args=(produce,consume,‘c2‘,lock))#     p1=Process(target=producer,args=(produce,consume,30))#     c1.start()#     c2.start()#     p1.start()#     produce.close()#     consume.close()

# pipe 数据不安全性# IPC# 加锁来控制操作管道的行为 来避免(多人消费同时取一个数据)进程之间争抢数据造成的数据不安全现象

# 队列 进程之间数据安全的# 管道 + 锁

#  进程之间的数据共享

普通正常的进程之间数据是不共享的# from multiprocessing import Manager,Process

# def main(dic):#     dic[‘count‘] -= 1#     print(dic)## if __name__ == ‘__main__‘:#     m = Manager()#     dic=m.dict({‘count‘:100})#     p_lst = []#     p = Process(target=main, args=(dic,))#     p.start()#     p.join()

from multiprocessing import Manager,Process,Lockdef main(dic,lock):    lock.acquire()    dic[‘count‘] -= 1  #这里会出现两个进程同时修改一个数据情况,最后会发现每次次执行count的值不一样,就是因为多进程同时操作一个数据导致的   lock.release()     #,正常理想count值应该是50,为了达到这效果就加锁。虽然加锁在效率会降低,但安全

if __name__ == ‘__main__‘:    m = Manager()    l = Lock()    dic=m.dict({‘count‘:100})    p_lst = []    for i in range(50):        p = Process(target=main,args=(dic,l))        p.start()        p_lst.append(p)    for i in p_lst: i.join()    print(‘主进程‘,dic)
#  进程池1

原文地址:https://www.cnblogs.com/mys6/p/10850226.html

时间: 2024-10-01 07:26:29

进程---管道、数据共享Manager、进程池和回调函数(重要)(六)的相关文章

W10_Pipe_Manager数据共享_进程池和回调函数

[TOC] #管道 ``` from multiprocessing import Pipe,Process def func(conn2): print(conn2.recv()) conn1,conn2 = Pipe() conn1.send("Hello pipe") p = Process(target=func, args=(conn2,)) p.start() ``` **多进程中管道异常EOFError** ``` from multiprocessing import

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

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

Python学习【第21篇】:进程池以及回调函数

python并发编程之多进程2-------------数据共享及进程池和回调函数 一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实上Manager的功能远不止于此. ? 1 2 3 4 命令就是一个程序,按回车就会执行(这个只是在windows情况下) tasklist 查看进程 tasklist | findstr  pycharm   #(

Python 3 进程池与回调函数

Python 3 进程池与回调函数 一.进程池 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.多进程是实现并发的手段之一,需要注意的问题是: 很明显需要并发执行的任务通常要远大于核数 一个操作系统不可能无限开启进程,通常有几个核就开几个进程 进程开启过多,效率反而会下降(开启进程是需要占用系统资源的,而且开启多余核数目的进程也无法做到并行) 例如当被操作对象数目不大时,可以直接利用multiprocessing中的Proces

第36篇 多进程的数据共享,进程池的回调函数,线程 什么是GIL锁,Threading模块记

内容概览: 进程 数据共享 进程池--回调函数 线程 线程的基础理论 什么是线程? 线程与进程的关系 GIL锁 线程的开启: Threading模块1,用多进程开启socket创建聊天 server端写了input函数会报错?因为服务器是高速运行的,自动化的为来访问的客户端提供服务, 不可能停下来等待管理员的输入,然后发送给客户.这就失去了自动化的意义. 2,进程池Pool()方法创建的进程,map()方法是否有返回值? p.map()得到的是迭代对象 import time from mult

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

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

管道,进程间数据共享,进程池

一:管道   (了解) 使用:from multiprocessing import Process,Pipe 知识: 1 创建管道时候:Pipe()默认是双工的,如改成False,那么conn1只能接收,conn2只能发送. conn1,conn2=Pipe() 2 Pipe模块发送字符串不用bytes类型,直接是字符串类型. Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1, conn2表示管道两端的连接对象,强调一点:必须在产生Pr

python全栈开发基础【第二十二篇】进程池和回调函数

一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实上Manager的功能远不止于此. 命令就是一个程序,按回车就会执行(这个只是在windows情况下) tasklist 查看进程 tasklist | findstr pycharm #(findstr是进行过滤的),|就是管道(tasklist执行的内容就放到管道里面了, 管道后面的findst

进程池与回调函数

一.进程池(重点) 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.多进程是实现并发的手段之一,需要注意的问题是: 1.很明显需要并发执行的任务通常要远大于核数 2.一个操作系统不可能无限开启进程,通常有几个核就开几个进程 3.进程开启过多,效率反而会下降(开启进程是需要占用系统资源的,而且开启多余核数目的进程也无法做到并行) 例如当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进

进程池、线程池及回调函数使用

一.线程池与进程池 池表示容器 线程就是装线程的容器 为什么要装到容器中 可以避免频繁的创建和销毁(进程/线程)来的资源开销 可以限制同时存在的线程数量 以保证服务器不会应为资源不足而导致崩溃 帮我们管理了线程的生命周期 管理了任务的分配 import os import time from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor from threading import activeCount,enum