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 ...
随机推荐
- 在 Visual Studio 中部署 ASP.NET Core 应用
另一篇:在 Docker 中手工部署 ASP.NET Core 应用 操作步骤 1. 安装 Docker For Windows(安装之前 Windows 需要 开启 Hyper-V 虚拟机功能 ) ...
- 用python写一个简单的文件上传
用Pycharm创建一个django项目.目录如下: <!DOCTYPE html> <html lang="en"> <head> <m ...
- 39 多线程(十一)——ThreadLocal
目前阶段,我只能知其然,不能做到知其所以然,这里引用一篇其所以然的文章,为以后理解ThreadLocal做准备: https://www.cnblogs.com/ldq2016/p/9041856.h ...
- 4. Spark SQL数据源
4.1 通用加载/保存方法 4.1.1手动指定选项 Spark SQL的DataFrame接口支持多种数据源的操作.一个DataFrame可以进行RDDs方式的操作,也可以被注册为临时表.把DataF ...
- spring boot 拦截 以及Filter和interceptor 、Aspect区别
一.通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求.在springboot中一般有两种配置方式.这种过滤器拦截并不知道你用的是哪一个Controller处理也不知道你用 ...
- spring源码解析前瞻
很多人有疑问:为什么要读源码?读源码有什么用?我也一直问自己这些问题,读源码非常枯燥,工作中又用不到,慢慢的自己读源码越发现自己知识的不足,无法把知识串起来,形成知识体系.从单系统中常用的Spring ...
- [NOIP2018 PJ T4]对称二叉树
题目大意:问一棵有根带权二叉树中最大的对称二叉树子树,对称二叉树为需满足将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等. 题解:在对称二叉树中,对于深度相同的两个节点$u,v$ ...
- MySql取消密码强度验证功能
一.修改MySql配置文件(my.cnf)一般情况下,MySql的配置文件 my.cnf 会在 /etc/ 目录下,如果没有,可以使用以下命令查找位置: find / -name my.cnf 编辑 ...
- AJAX 初识
AJAX全称为 Asynchronous Javasript And XML,是在浏览器端进行网络编程(发送请求,接收响应)的技术方案.AJAX 也就是浏览器提供的一套API,可以供 Javascri ...
- 初始SQL语句 简单使用
初始SQL语句 简单使用 SQL语言共分为四大类: DQL (Data QueryLanguage )数据查询语言 DML(Data manipulation language)数据操纵语言 DDL( ...