python并发编程—进程间通信(代码片段)

maplethefox maplethefox     2022-12-17     634

关键词:

进程间通信(IPC)

 

1.必要性: 进程间空间独立,资源不共享,此时在需要进程间数据传输时就需要特定的手段进行数据通信。

 

 

2.常用进程间通信方法:管道通信、消息队列、共享内存、信号量

 

管道通信(Pipe)

1.通信原理:在内存中开辟管道空间,生成管道操作对象,多个进程使用同一个管道对象进行读写即可实现通信

2.实现方法

from multiprocessing import Pipe

fd1,fd2 = Pipe(duplex = True)

  • 功能: 创建管道
  • 参数:默认表示双向管道
  • 如果为False 表示单向管道
  • 返回值:表示管道两端的读写对象
  •   如果是双向管道均可读写
  •   如果是单向管道fd1只读 fd2只写

fd.recv()

  • 功能 : 从管道获取内容
  • 返回值:获取到的数据

fd.send(data)

  • 功能: 向管道写入内容
  • 参数: 要写入的数据
技术图片
 1 from multiprocessing import Process,Pipe
 2 import os,time
 3 
 4 # 创建管道对象
 5 # False fd1只能recv fd2只能send
 6 fd1,fd2 = Pipe(False)
 7 
 8 def read():
 9   while True:
10     data = fd1.recv()  # 从管道获取消息
11     print(data)
12 
13 def write():
14   while True:
15     time.sleep(2)
16     fd2.send(name:Lily) # 向管道发送内容
17 
18 r = Process(target=read)
19 w = Process(target=write)
20 r.start()
21 w.start()
22 r.join()
23 w.join()
管道通信示例

消息队列

1.通信原理:在内存中建立队列模型,进程通过队列将消息存入,或者从队列取出完成进程间通信。

2.实现方法

from multiprocessing import Queue

q = Queue(maxsize=0)

  • 功能: 创建队列对象
  • 参数:最多存放消息个数
  • 返回值:队列对象

q.put(data,[block,timeout])

  • 功能:向队列存入消息
  • 参数:data 要存入的内容
  • block 设置是否阻塞 False为非阻塞
  • timeout 超时检测

q.get([block,timeout])

  • 功能:从队列取出消息
  • 参数:block 设置是否阻塞 False为非阻塞
  • timeout 超时检测
  • 返回值: 返回获取到的内容

q.full() 判断队列是否为满

q.empty() 判断队列是否为空

q.qsize() 获取队列中消息个数

q.close() 关闭队列

技术图片
 1 from multiprocessing import Process, Queue
 2 from time import sleep
 3 from random import randint
 4 
 5 #  创建消息队列
 6 q = Queue(3)
 7 
 8 
 9 # 请求进程
10 def request():
11   for i in range(10):
12     x = randint(0, 100)
13     y = randint(0, 100)
14     q.put((x, y))
15 
16 
17 # 处理进程
18 def handle():
19   while True:
20     sleep(1)
21     try:
22       x, y = q.get(timeout=5)
23     except:
24       break
25     else:
26       print("%d + %d = %d" % (x, y, x + y))
27 
28 
29 p1 = Process(target=request)
30 p2 = Process(target=handle)
31 p1.start()
32 p2.start()
33 p1.join()
34 p2.join()
消息队列演示

共享内存

 

1.通信原理:在内中开辟一块空间,进程可以写入内容和读取内容完成通信,但是每次写入内容会覆盖之前内容。

 

 

2.实现方法

 

技术图片

from multiprocessing import Value,Array

obj = Value(ctype,data)

  • 功能 : 开辟共享内存
  • 参数 : ctype 表示共享内存空间类型 ‘i‘ ‘f‘ ‘c‘
  •      data 共享内存空间初始数据
  • 返回值:共享内存对象

obj.value

  • 对该属性的修改查看即对共享内存读写

obj = Array(ctype,data)

  • 功能: 开辟共享内存空间
  • 参数: ctype 表示共享内存数据类型
  •     data 整数则表示开辟空间的大小,其他数据类型表示开辟空间存放的初始化数据
  • 返回值:共享内存对象

Array共享内存读写: 通过遍历obj可以得到每个值,直接可以通过索引序号修改任意值。

* 可以使用obj.value直接打印共享内存中的字节串
技术图片
 1 from multiprocessing import Process,Value
 2 import time
 3 from random import randint
 4 
 5 # 创建共享内存
 6 money = Value(i,5000)
 7 
 8 #  修改共享内存
 9 def man():
10   for i in range(30):
11     time.sleep(0.2)
12     money.value += randint(1,1000)
13 
14 def girl():
15   for i in range(30):
16     time.sleep(0.15)
17     money.value -= randint(100,800)
18 
19 m = Process(target = man)
20 g = Process(target = girl)
21 m.start()
22 g.start()
23 m.join()
24 g.join()
25 
26 # 获取共享内存值
27 print("一月余额:",money.value)
value
技术图片
 1 from multiprocessing import Process,Array
 2 
 3 # 创建共享内存
 4 # shm = Array(‘i‘,[1,2,3])
 5 # shm = Array(‘i‘,3)  # 表示开辟三个空间的列表
 6 shm = Array(c,b"hello") #字节串
 7 
 8 def fun():
 9   # 共享内存对象可迭代
10   for i in shm:
11     print(i)
12   shm[0] = bH
13 
14 p = Process(target = fun)
15 p.start()
16 p.join()
17 
18 for i in shm:
19   print(i)
20 
21 print(shm.value) # 打印字节串
array

信号量(信号灯集)

1.通信原理:给定一个数量对多个进程可见。多个进程都可以操作该数量增减,并根据数量值决定自己的行为。

2.实现方法

from multiprocessing import Semaphore

sem = Semaphore(num)

  • 功能 : 创建信号量对象
  • 参数 : 信号量的初始值
  • 返回值 : 信号量对象

sem.acquire() 将信号量减1 当信号量为0时阻塞

sem.release() 将信号量加1

sem.get_value()获取信号量数量

技术图片
 1 from multiprocessing import Process,Semaphore
 2 from time import sleep
 3 import os
 4 
 5 # 创建信号量 最多允许三个任务同时执行
 6 sem = Semaphore(3)
 7 
 8 # 任务函数
 9 def handle():
10   sem.acquire()  # 想执行必须消耗一个信号量
11   print("%d 执行任务"%os.getpid())
12   sleep(2)
13   print("%d 执行任务完毕"%os.getpid())
14   sem.release() # 增加信号量
15 
16 # 10人想执行
17 for i in range(10):
18   p = Process(target=handle)
19   p.start()
sem

 

 

java并发编程线程简介(进程与线程|并发概念|线程间通信|java并发3特性)(代码片段)

文章目录一、进程与线程二、并发三、线程间通信四、Java并发3特性一、进程与线程最开始是没有线程这个概念的,一个应用程序就是一个进程,应用程序运行时,如果还要处理与用户交互的逻辑,二者只能交替进行,这样CPU执行效率... 查看详情

并发编程(代码片段)

一、多进程并发和多线程并发多进程并发有进程间通信机制,更加安全。第一个缺点:进程间通信为避免一个进程修改另一个进程,比如读时共享写时复制使得花销更大;第二个缺点:需要启动进程,还要系统内核来管理进程,... 查看详情

python:并发编程(代码片段)

Python并发编程Python并发编程创建子进程进程池队列进程之间的通信线程线程锁线程同步网络编程IP地址与端口端口网络通信协议TCP/UDP套接字编程TFTP文件下载器Python并发编程代码编写完没有运行称之为程序,正在运行的代码就... 查看详情

python之进程同步控制(锁信号量事件)进程间通信——队列和管道(代码片段)

进程同步(multiprocess.Lock、multiprocess.Semaphore、multiprocess.Event)锁——multiprocess.Lock通过刚刚的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启也不受我们控... 查看详情

并发编程中使用到的模块,相关总结(代码片段)

多进程:multiprocessing包  开启进程:multiprocessing.Process,  进程池:multiprocessing.Pool,  进程间同步控制:multiprocessing.Lock  multiprocessing.Semaphore  multiprocessing.Event  进程间通信:multiprocessing.Queue  multiproces 查看详情

python3网络编程和并发编程总结(代码片段)

目录网络编程开发架构OSI七层模型socketsubprocess粘包问题socketserverTCPUDP并发编程多道技术并发和并行进程僵尸进程和孤儿进程守护进程互斥锁队列IPC进程间通信生产者与消费者模型线程GIL多线程与多进程的选择死锁递归锁信号量... 查看详情

并发编程(队列)(代码片段)

队列介绍进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的创建队列的类(底层就是以管道和锁定的方式实现):Queue([maxsize]):创建共享的进程队列... 查看详情

并发编程--进程(代码片段)

内容目录1.前提介绍操作系统发展史多道技术2.进程进程介绍进程调度进程状态转换同步与异步,阻塞与非阻塞创建进程的两种方式join方法进程间的数据隔离与通信进程对象的其他相关方法僵尸进程与孤儿继承守护进程互斥锁一... 查看详情

python并发编程-管道(代码片段)

管道的作用-两个进程间传递消息frommultiprocessingimportPipe,Processdeffunc(conn1,conn2):conn2.close()#子进程只需使用connection1,故关闭connection2whileTrue:try:msg=conn1.recv()print(msg)exceptEOFError:#没收数据接收的时候,才抛出的异常conn1.cl 查看详情

linux系统编程-进程间通信(管道)(代码片段)

1.进程间通信方式介绍这篇文章介绍Linux下进程的间的通信方式,常用的方式如下:1.socket—网络通信2.管道---无名管道—命名管道---文件--FIFO3.消息队列4.共享内存5.信号量集6.信号—signal捕获信号---kill命令发送信号intkill(pid_tpid... 查看详情

41_并发编程-队列(代码片段)

一、定义    进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的。队列就像一个特殊的列表,但是可以设置固定长度,并且从前面插入... 查看详情

测开之并发编程篇・《并发并行线程队列进程和协程》(代码片段)

并发编程并发和并行多任务概念并发和并行同步和异步多线程threading模块介绍自定义线程类线程任务函数的传递多线程资源共享和资源竞争问题GIL全局解释锁互斥锁通过锁解决资源竞争问题死锁队列队列的方法FIFO先入先出队列LI... 查看详情

并发编程知识点剖析(代码片段)

   并发编程知识点剖析一.    进程(Process):是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是线程的容器。  线程(Threading): 一条流水线的工作过程,cpu最小执行单位  线程与进程的区别可... 查看详情

并发编程相关知识(代码片段)

1、并发编程领域的关键问题线程之间的通信线程间的同步1.1线程之间的通信线程之间的通信机制有两种,共享内存和消息传递。在共享内存的并发模型里,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存... 查看详情

socket编程(代码片段)

...们每天浏览网页、QQ聊天、收发email等等二、创建socket在Python中使用socket模块的函数socket就可以完成:socket.socket(AddressFamily,Type)说明:函数socket.socket创建一个socket,返回该socket的描述符,该函数带有两个参数:AddressFamily:可以选... 查看详情

并发编程——开启进程(代码片段)

 一、multiprocessing模块 1、multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。 2、multiprocessing模块的功能众多:支持子进程、通信和共享数... 查看详情

python_并发编程——管道和数据共享(代码片段)

1.管道frommultiprocessingimportPipeconn1,conn2=Pipe()#返回两个值conn1.send(‘wdc‘)#发送print(conn2.recv())#接收conn2.send(‘yhf‘)print(conn1.recv())结果:~双向通信 2.在进程中传递数据frommultiprocessingimportPipe,Processclas 查看详情

进程间通信&死锁&信号量及pv原语(代码片段)

文章目录进程间通信(Inter-ProcessCommunication,IPC)顺序程序与并发程序的特征进程互斥、临界资源、临界区同步的细分进程间通信目的进程间通信发展进程间通信分类进程间共享信息的三种方式死锁及死锁产生条件哲学家就餐问题信... 查看详情