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 ...
随机推荐
- python爬虫scrapy(一)
一,准备scrapy依赖组件环境,按照以下顺序安装 .wheel pip install wheel .lxml http:.PyOpenssl https://pypi.python.org/pyp ...
- Netty--索引
Netty 入门示例 Netty原理架构解析 Netty 基本原理 Netty面试题 阿里的Netty知识点你又了解多少
- configparser 文件加字典操作
import configparser conf=configparser.ConfigParser() #創建一個對象 # f=open('db.ini','w') conf['DEFAULT'] ...
- flask框架(三)——路由系统route转换成add_url_rule及源码分析
这节我们不用@app.route来写路由,而是通过add_url_rule 传统写法 (<int:nid>传递int类型参数,endpoint是取别名) @app.route('/det ...
- 二次剩余定理及Cipolla算法入门到自闭
二次剩余定义: 在维基百科中,是这样说的:如果q等于一个数的平方模 n,则q为模 n 意义下的二次剩余.例如:x2≡n(mod p).否则,则q为模n意义下的二次非剩余. Cipolla算法:一个解决 ...
- 【LEETCODE】35、169题, Majority Element
package y2019.Algorithm.array; import java.util.HashMap; import java.util.Map; /** * @ProjectName: c ...
- docker自动化脚本
使用脚本从git上拉取项目并运行, 有些不足的地方 编写脚本 run.sh 如果用到redis和myslq,要先启动redis和mysql #!/bin/bash # author:qiao # 更新 ...
- adb命令查看连接PC的移动设备
cmd窗口中输入adb应会出现上图情况,如果显示不存在则需要网上下载adb工具并在我的电脑-属性-高级系统设置-环境变量中将adb工具的路径加入PATH,如下图: 输入adb devices 可以看到 ...
- Mysql中HAVING的相关使用方法
having字句可以让我们筛选分组之后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前. 而having子句在聚合后对组记录进行筛选.我的理解就是真实表 ...
- gitlab 安装、备份与还原及常见设置
gitlab 安装.备份与还原及常见设置 安装 安装过程比较简单,跑在 docker 上,执行命令即可 -v参数后面的值为卷的名称,自动创建数据卷(如果数据卷不存在) https://docs.git ...