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 ...
随机推荐
- 使用WinFrom + CefSharp 开发客户端程序
今天使用CefSharp,加上本地资源文件嵌入了HTML.CSS.JS文件,做为Winform的UI:效果不错,漂亮可控,简简单单,半天时间搞定从开发到上线: 下面记录下相关的备忘: (窗口的效果) ...
- 悬架的灵魂——K&C特性
静止便是死亡,只有运动才能敲开永生的大门 — 泰戈尔 KC特性是车辆操控稳定性的直接影响者!可以分为 K ( Kinematic) 特性和 C( Compliance) 特性: K 特性即悬 ...
- JAVA多态中的隐藏和覆盖
Java的引用变量有两个类型,一个是编译时类型,一个是运行时类型 编译时类型:由声明该变量时使用的类型决定 运行时类型:由该变量指向的对象类型决定 如果编译时类型和运行时类型不一致,会出现所谓的多态. ...
- 开发板与pc之间文件传输:kermit and lrzsz
imx6开发板与pc机之间通过串口传输文件步骤: 1. 安装好kermit并可以使用 2. 交叉编译lrzsz开源软件并把可执行程序lrz lsz拷贝到开发板 2.1 下载并解压lrzsz-0.12. ...
- Java开发笔记(一百一十九)AWT布局
前面介绍了如何在窗口上添加一个按钮,可是每个软件界面都包含了许多控件,这些控件又是按照什么规则在界面上排列的呢?仍以按钮为例,假如要在窗口上依次添加多个按钮,那么界面会怎样显示这些按钮?想当然的话,按 ...
- PB连接ORALCE数据库方法
本地必须配置连接服务
- appium实例1:启动淘宝app
1.在android-sdk里面双击SDK-manager,下载buidl-tools 2.勾选build-tools,随便选一个版本,我这里选的是24的版本 3.下载完成后,在D:\androi ...
- 组件系列之RabbitMQ
官网: https://www.rabbitmq.com/getstarted.html 1.四种交换机 TODO... 2.消费者获取消息方式:推 和 拉 拉取:每次拉取一条,循环拉取需要的条数在批 ...
- mpvue + vant + flyio 小程序项目总结
vant 的使用 我开始是 npm 导入,然后 import,使用不了. 找了各种方法,最后还是下载文件,然后找到 dist 文件夹,复制到项目里,我是放在 static 文件夹,文件名 dist 重 ...
- treeMultiselect 去掉勾选项
场景描述:弹窗,显示树形结构,节点层次可变(可只有一级节点,也可是多级节点),限制只能选择一个节点! 1.修改jquery.tree-multiselect.min.js 文件 2.前台页面 参考代码 ...