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_并发编程——管道的更多相关文章

  1. Python 并发编程(管道,事件,信号量,进程池)

    管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...

  2. Python并发编程-管道

    管道的作用- 两个进程间传递消息 from multiprocessing import Pipe, Process def func(conn1,conn2): conn2.close() #子进程 ...

  3. python_并发编程——进程池

    1.进程池 from multiprocessing import Pool def func(n): for i in range(10): print(n+1) if __name__ == '_ ...

  4. python_并发编程——数据共享

    1.数据共享 实现进程之间的数据共享 from multiprocessing import Manager,Process class MyPro(Process): def __init__(se ...

  5. python_并发编程——消费者和生产者模型

    消费者和生产者模型 from multiprocessing import Process,Queue import time import random class Producer(Process ...

  6. python_并发编程——队列

    1.队列 from multiprocessing import Queue q = Queue(5) #创建队列对象,队列大小为5,队列中只能存放5个元素 q.put(1) #往队列中添加元素 q. ...

  7. python_并发编程——事件

    1.事件 :通过一个信号来控制多个进程同时执行或者阻塞. 一个信号可以使所有的进程都进入阻塞状态,也可以控制所有的进程接触阻塞,一个事件被创建之后,默认是阻塞状态. from multiprocess ...

  8. python_并发编程——锁

    多进程模拟买票~ import time import json from multiprocessing import Process class Show(Process): #查 def run ...

  9. python_并发编程——守护进程

    1.守护进程 守护进程会随着主进程的代码执行结束而结束. 语法:进程对象.daemon = True时,表示将进程设置为守护进程,一定在start之前设置. import time from mult ...

随机推荐

  1. 在 Visual Studio 中部署 ASP.NET Core 应用

    另一篇:在 Docker 中手工部署 ASP.NET Core 应用 操作步骤 1. 安装 Docker For Windows(安装之前 Windows 需要 开启 Hyper-V 虚拟机功能 ) ...

  2. 用python写一个简单的文件上传

    用Pycharm创建一个django项目.目录如下: <!DOCTYPE html> <html lang="en"> <head> <m ...

  3. 39 多线程(十一)——ThreadLocal

    目前阶段,我只能知其然,不能做到知其所以然,这里引用一篇其所以然的文章,为以后理解ThreadLocal做准备: https://www.cnblogs.com/ldq2016/p/9041856.h ...

  4. 4. Spark SQL数据源

    4.1 通用加载/保存方法 4.1.1手动指定选项 Spark SQL的DataFrame接口支持多种数据源的操作.一个DataFrame可以进行RDDs方式的操作,也可以被注册为临时表.把DataF ...

  5. spring boot 拦截 以及Filter和interceptor 、Aspect区别

    一.通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求.在springboot中一般有两种配置方式.这种过滤器拦截并不知道你用的是哪一个Controller处理也不知道你用 ...

  6. spring源码解析前瞻

    很多人有疑问:为什么要读源码?读源码有什么用?我也一直问自己这些问题,读源码非常枯燥,工作中又用不到,慢慢的自己读源码越发现自己知识的不足,无法把知识串起来,形成知识体系.从单系统中常用的Spring ...

  7. [NOIP2018 PJ T4]对称二叉树

    题目大意:问一棵有根带权二叉树中最大的对称二叉树子树,对称二叉树为需满足将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等. 题解:在对称二叉树中,对于深度相同的两个节点$u,v$ ...

  8. MySql取消密码强度验证功能

    一.修改MySql配置文件(my.cnf)一般情况下,MySql的配置文件 my.cnf 会在  /etc/ 目录下,如果没有,可以使用以下命令查找位置: find / -name my.cnf 编辑 ...

  9. AJAX 初识

    AJAX全称为 Asynchronous Javasript And XML,是在浏览器端进行网络编程(发送请求,接收响应)的技术方案.AJAX 也就是浏览器提供的一套API,可以供 Javascri ...

  10. 初始SQL语句 简单使用

    初始SQL语句 简单使用 SQL语言共分为四大类: DQL (Data QueryLanguage )数据查询语言 DML(Data manipulation language)数据操纵语言 DDL( ...