python_并发编程——管道
1.管道
from multiprocessing import Pipe conn1,conn2 = Pipe() #返回两个值
conn1.send('wdc') #发送
print(conn2.recv()) #接收
conn2.send('yhf')
print(conn1.recv())
结果:
~双向通信
2.在进程中传递数据
from multiprocessing import Pipe,Process class Pr1(Process):
def __init__(self,conn1):
super().__init__()
self.conn1 = conn1
def run(self):
self.conn1.send('吃了吗?') if __name__ == '__main__':
conn1,conn2 = Pipe()
p = Pr1(conn1)
p.start()
print(conn2.recv())
结果:
解决当管道内数据为空时,还在继续获取数据时造成的阻塞问题。
from multiprocessing import Pipe,Process class Pr1(Process):
def __init__(self,conn1,conn2):
super().__init__()
self.conn1 = conn1
self.conn2 = conn2
def run(self):
self.conn2.close() #关闭conn2
while True:
try:
print(self.conn1.recv())
except EOFError: #当其他所有的conn端口都被关闭,只剩下一个conn端口还在获取管道内的数据,而管道内已经空了的时候就会报EOFError错误。
self.conn1.close() #关闭conn1
break if __name__ == '__main__':
conn1,conn2 = Pipe()
p = Pr1(conn1,conn2)
p.start()
conn1.close() #关闭conn1
for i in range(10):
conn2.send('吃了吗?')
conn2.close() #关闭conn2
结果:
输出10次数据,然后结束全部进程。
管道实现生产者消费者问题:
from multiprocessing import Pipe,Process
import time
import random
class Producer(Process): #生产者类
def __init__(self,pro,con,name,food):
super().__init__()
self.pro = pro
self.con = con
self.name = name
self.food = food
def run(self):
self.con.close()
for i in range(4):
time.sleep(random.randint(1,3))
f = '{}生产了第{}个{}'.format(self.name,i,self.food)
print(f)
self.pro.send(f)
self.pro.close()
class Consumer(Process):
def __init__(self,pro,con,name):
super().__init__()
self.pro = pro
self.con = con
self.name = name
def run(self):
self.pro.close()
while True:
try:
f = self.con.recv()
print('{}吃了{}'.format(self.name,f))
time.sleep(random.randint(1,3))
except EOFError:
self.con.close()
break if __name__ == '__main__':
con,pro = Pipe()
p1 = Producer(pro,con,'wdc','包子')
p1.start()
c1 = Consumer(pro,con,'yhf')
c1.start()
con.close()
pro.close()
结果:
如果同时有两个消费者同时拿到管道中相同的数据,则会报错,管道中的数据是不安全的。
可以以用加锁来避免进程直接争抢数据造成的数据不安全现象。但是队列是安全的,队列就是基于管道+锁
python_并发编程——管道的更多相关文章
- Python 并发编程(管道,事件,信号量,进程池)
管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...
- Python并发编程-管道
管道的作用- 两个进程间传递消息 from multiprocessing import Pipe, Process def func(conn1,conn2): conn2.close() #子进程 ...
- python_并发编程——进程池
1.进程池 from multiprocessing import Pool def func(n): for i in range(10): print(n+1) if __name__ == '_ ...
- python_并发编程——数据共享
1.数据共享 实现进程之间的数据共享 from multiprocessing import Manager,Process class MyPro(Process): def __init__(se ...
- python_并发编程——消费者和生产者模型
消费者和生产者模型 from multiprocessing import Process,Queue import time import random class Producer(Process ...
- python_并发编程——队列
1.队列 from multiprocessing import Queue q = Queue(5) #创建队列对象,队列大小为5,队列中只能存放5个元素 q.put(1) #往队列中添加元素 q. ...
- python_并发编程——事件
1.事件 :通过一个信号来控制多个进程同时执行或者阻塞. 一个信号可以使所有的进程都进入阻塞状态,也可以控制所有的进程接触阻塞,一个事件被创建之后,默认是阻塞状态. from multiprocess ...
- python_并发编程——锁
多进程模拟买票~ import time import json from multiprocessing import Process class Show(Process): #查 def run ...
- python_并发编程——守护进程
1.守护进程 守护进程会随着主进程的代码执行结束而结束. 语法:进程对象.daemon = True时,表示将进程设置为守护进程,一定在start之前设置. import time from mult ...
随机推荐
- 面试之leetcode20堆栈-字符串括号匹配,队列实现栈
1 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可被认 ...
- mac远程连接linux 服务器桌面by VNC
为了远程使用Linux服务器,折腾了一个下午.最终看来还是用vnc最简单了. 实验室有两台强劲的Linux服务器用来做研究.之前我一直都是用ssh登到服务器上去码代码,反应速度很快,感觉很不错.但是因 ...
- VMware vSphere6.0 服务器虚拟化部署安装图解(最全,最详细)-搭建的所有步骤
VMware vSphere6.0 服务器虚拟化部署安装图解 一 .VMware vSphere部署的前期规划要点 1.vSphere的优点 (略) 2如何利用现在的设备架构虚拟化环境 在虚拟化过程中 ...
- 卸载桌面产品,弹出错误框The Windows Installer service could not be accessed
卸载程序报这个错误: https://helpdeskgeek.com/how-to/how-to-fix-the-windows-installer-service-could-not-be-acc ...
- SQL——AS别名
一.SQL别名的基本用法 SQL可以为表或者列指定别名. 语法格式如下(表): SELECT 列名1,列名2... FROM 表名 AS 别名; 语法格式如下(列): SELECT 列名1 AS 别名 ...
- day36——死锁、递归锁、信号量、GIL、多线程实现socket通信、线程池和进程池
day36 死锁现象与递归锁 死锁现象 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...
- 少儿编程|Scratch编程教程系列合集,总有一款适合你
如果觉得资源不错,友情转发,贵在分享!!! 少儿编程Scratch: 少儿编程Scratch第一讲:Scratch完美的初体验少儿编程Scratch第二讲:奇妙的接球小游戏少儿编程Scratch第三讲 ...
- ColorMatrixFilter色彩矩阵滤镜
ColorMatrixFilter色彩矩阵滤镜: /** * * *----------------------------------------* * | *** ColorMatrixFilte ...
- JAVA day2 语言基础
一.注释 描述代码的文字 1.// 单行注释 2./* */ 多行注释 (多行注释中不能再嵌套多行注释) 3./** */ 多行注释 配合JavaDoc工具使用(只可以看到注释,看不到代码 ...
- asp.net Code CSRedis学习记录
1.安装Redis for windows 安装地址 https://github.com/MicrosoftArchive/redis/releases Redis 是完全开源免费的,遵守BSD协议 ...