Python 进程间通信 Queue / Pipe - Python零基础入门教程
程序员文章站
2022-03-10 11:35:13
目录 一.前言 1.使用 Queue 线程间通信 2.使用 Queue 进程间通信,适用于多个进程之间通信 3.使用 Pipe 进程间通信,适用于两个进程之间通信(一对一) 二.python 进程间通信 Queue/Pipe 使用 1.使用 Queue 进程间通信 2.使用 Pipe 进程间通信 三 ......
目录
零基础 python 学习路线推荐 : python 学习目录 >> python 基础入门
一.前言
1.在前一篇文章 python 进程 process 与线程 threading 区别 中讲到线程 threading 共享内存地址,进程与进程 peocess 之间相互独立,互不影响(相当于深拷贝);
2.在线程间通信的时候可以使用 queue 模块完成,间通信也可以通过 queue 完成,但是此 queue 并非线程的 queue ,进程间通信 queue 是将数据 pickle 后传给另一个进程的 queue,;
1.使用 queue 线程间通信
# !usr/bin/env python # -*- coding:utf-8 _*- """ @author:猿说编程 @blog(个人博客地址): www.codersrc.com @file:python 进程间通信 queue / pipe.py @time:2021/05/09 07:37 @motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! """ #导入线程相关模块 import threading import queue q = queue.queue()
2.使用 queue 进程间通信,适用于多个进程之间通信
# !usr/bin/env python # -*- coding:utf-8 _*- """ @author:猿说编程 @blog(个人博客地址): www.codersrc.com @file:python 进程间通信 queue / pipe.py @time:2021/05/09 07:37 @motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! """ # 导入进程相关模块 from multiprocessing import process from multiprocessing import queue q = queue()
3.使用 pipe 进程间通信,适用于两个进程之间通信(一对一)
# !usr/bin/env python # -*- coding:utf-8 _*- """ @author:猿说编程 @blog(个人博客地址): www.codersrc.com @file:python 进程间通信 queue / pipe.py @time:2021/05/09 07:37 @motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! """ # 导入进程相关模块 from multiprocessing import process from multiprocessing import pipe pipe = pipe()
二.python 进程间通信 queue/pipe 使用
python 提供了多种进程通信的方式,主要 queue 和 pipe 这两种方式,queue 用于多个进程间实现通信,pipe 用于两个进程的通信;
1.使用 queue 进程间通信
- put :以插入数据到队列中,他还有两个可选参数:blocked 和 timeout 。详情自行百度
- get :从队列读取并且删除一个元素。同样还有两个可选参数:blocked 和 timeout , 详情自行百度
# !usr/bin/env python # -\_- coding:utf-8 \_\_- """ @author:猿说编程 @blog(个人博客地址): www.codersrc.com @file:python 进程间通信 queue / pipe.py @time:2021/05/09 07:37 @motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! """ from multiprocessing import process from multiprocessing import queue import os,time,random #写数据进程执行的代码 def proc_write(q,urls): print ('process is write....') for url in urls: q.put(url) print ('put %s to queue... ' %url) time.sleep(random.random()) #读数据进程的代码 def proc_read(q): print('process is reading...') while true: url = q.get(true) print('get %s from queue' %url) if **name** == '**main**': #父进程创建 queue,并传给各个子进程 q = queue() proc_write1 = process(target=proc_write,args=(q,['url_1','url_2','url_3'])) proc_write2 = process(target=proc_write,args=(q,['url_4','url_5','url_6'])) proc_reader = process(target=proc_read,args=(q,)) #启动子进程,写入 proc_write1.start() proc_write2.start() proc_reader.start() #等待proc_write1结束 proc_write1.join() proc_write2.join() #proc_raader进程是死循环,强制结束 proc_reader.terminate() print("mian") ''' 输出结果: process is write.... put url_1 to queue... process is write.... put url_4 to queue... process is reading... get url_1 from queue get url_4 from queue put url_5 to queue... get url_5 from queue put url_2 to queue... get url_2 from queue put url_3 to queue... get url_3 from queue put url_6 to queue... get url_6 from queue mian '''
2.使用 pipe 进程间通信
pipe 常用于两个进程,两个进程分别位于管道的两端 pipe 方法返回(conn1,conn2)代表一个管道的两个端,pipe 方法有 duplex 参数,默认为 true ,即全双工模式,若为 false ,conn1 只负责接收信息,conn2 负责发送, pipe 同样也包含两个方法:
send : 发送信息;
recv : 接收信息;
# !usr/bin/env python # -*- coding:utf-8 _*- """ @author:猿说编程 @blog(个人博客地址): www.codersrc.com @file:python 进程间通信 queue / pipe.py @time:2021/05/09 07:37 @motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! """ from multiprocessing import process from multiprocessing import pipe import os,time,random #写数据进程执行的代码 def proc_send(pipe,urls): #print 'process is write....' for url in urls: print ('process is send :%s' %url) pipe.send(url) time.sleep(random.random()) #读数据进程的代码 def proc_recv(pipe): while true: print('process rev:%s' %pipe.recv()) time.sleep(random.random()) if __name__ == '__main__': #父进程创建pipe,并传给各个子进程 pipe = pipe() p1 = process(target=proc_send,args=(pipe[0],['url_'+str(i) for i in range(10) ])) p2 = process(target=proc_recv,args=(pipe[1],)) #启动子进程,写入 p1.start() p2.start() p1.join() p2.terminate() print("mian") ''' 输出结果: process is send :url_0 process rev:url_0 process is send :url_1 process rev:url_1 process is send :url_2 process rev:url_2 process is send :url_3 process rev:url_3 process is send :url_4 process rev:url_4 process is send :url_5 process is send :url_6 process is send :url_7 process rev:url_5 process is send :url_8 process is send :url_9 process rev:url_6 mian '''
三.测试 queue.queue 来完成进程间通信能否成功?
当然我们也可以尝试使用线程 threading 的 queue 是否能完成线程间通信,示例代码如下:
# !usr/bin/env python # -*- coding:utf-8 _*- """ @author:猿说编程 @blog(个人博客地址): www.codersrc.com @file:python 进程间通信 queue / pipe.py @time:2021/05/09 07:37 @motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! """ from multiprocessing import process # from multiprocessing import queue # 进程间通信queue,两者不要混淆 import queue # 线程间通信queue.queue,两者不要混淆 import time def p_put(q,*args): q.put(args) print('has put %s' % args) def p_get(q,*args): print('%s wait to get...' % args) print(q.get()) print('%s got it' % args) if __name__ == "__main__": q = queue.queue() p1 = process(target=p_put, args=(q,'p1', )) p2 = process(target=p_get, args=(q,'p2', )) p1.start() p2.start() ''' 直接异常报错: traceback (most recent call last): file "e:/project/python_project/untitled10/123.py", line 38, in <module> p1.start() file "g:\programdata\anaconda3\lib\multiprocessing\process.py", line 105, in start self._popen = self._popen(self) file "g:\programdata\anaconda3\lib\multiprocessing\context.py", line 223, in _popen return _default_context.get_context().process._popen(process_obj) file "g:\programdata\anaconda3\lib\multiprocessing\context.py", line 322, in _popen return popen(process_obj) file "g:\programdata\anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__ reduction.dump(process_obj, to_child) file "g:\programdata\anaconda3\lib\multiprocessing\reduction.py", line 60, in dump forkingpickler(file, protocol).dump(obj) typeerror: can't pickle _thread.lock objects '''
四.猜你喜欢
- python 条件推导式
- python 列表推导式
- python 字典推导式
- python 不定长参数 *argc/**kargcs
- python 匿名函数 lambda
- python return 逻辑判断表达式
- python is 和 == 区别
- python 可变数据类型和不可变数据类型
- python 浅拷贝和深拷贝
- python 异常处理
- python 线程创建和传参
- python 线程互斥锁 lock
- python 线程时间 event
- python 线程条件变量 condition
- python 线程定时器 timer
- python 线程信号量 semaphore
- python 线程障碍对象 barrier
- python 线程队列 queue – fifo
- python 线程队列 lifoqueue – lifo
- python 线程优先队列 priorityqueue
- python 线程池 threadpoolexecutor(一)
- python 线程池 threadpoolexecutor(二)
- python 进程 process 模块
- python 进程 process 与线程 threading 区别
- python 进程间通信 queue / pipe
未经允许不得转载: » python 进程间通信 queue / pipe
[喜欢(1)](javascript:
推荐阅读
-
Python多进程通信Queue、Pipe、Value、Array实例
-
Python进程间通信Queue消息队列用法分析
-
Python多进程通信Queue、Pipe、Value、Array实例
-
Python进程间通信Queue实例解析
-
Python 进程互斥锁 Lock - Python零基础入门教程
-
Python 进程间通信 Queue / Pipe - Python零基础入门教程
-
Python 进程 Process 与线程 threading 区别 - Python零基础入门教程
-
Python 进程 Process 模块 - Python零基础入门教程
-
Python进程间通信Queue消息队列用法分析
-
Python进程间通信Queue实例解析