Python 进程间通信 Queue / Pipe - Python零基础入门教程
目錄
- 一.前言
- 1.使用 Queue 線程間通信
- 2.使用 Queue 進程間通信,適用于多個進程之間通信
- 3.使用 Pipe 進程間通信,適用于兩個進程之間通信(一對一)
- 二.python 進程間通信 Queue/Pipe 使用
- 1.使用 Queue 進程間通信
- 2.使用 Pipe 進程間通信
- 三.測試 queue.Queue 來完成進程間通信能否成功?
- 四.猜你喜歡
零基礎 Python 學習路線推薦 :?Python 學習目錄?>>?Python 基礎入門
一.前言
1.在前一篇文章 ?Python 進程 Process 與線程 threading 區(qū)別? 中講到線程 threading 共享內(nèi)存地址,進程與進程 Peocess 之間相互獨立,互不影響(相當于深拷貝);
2.在線程間通信的時候可以使用 Queue 模塊完成,進程間通信也可以通過 Queue 完成,但是此 Queue 并非線程的 Queue ,進程間通信 Queue 是將數(shù)據(jù) 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 queueq = 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 Queueq = 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 Pipepipe = Pipe()二.python 進程間通信 Queue/Pipe 使用
Python 提供了多種進程通信的方式,主要 Queue 和 Pipe 這兩種方式,Queue 用于多個進程間實現(xiàn)通信,Pipe 用于兩個進程的通信;
1.使用 Queue 進程間通信
- put :以插入數(shù)據(jù)到隊列中,他還有兩個可選參數(shù):blocked 和 timeout 。詳情自行百度
- get :從隊列讀取并且刪除一個元素。同樣還有兩個可選參數(shù):blocked 和 timeout , 詳情自行百度
2.使用 Pipe 進程間通信
Pipe 常用于兩個進程,兩個進程分別位于管道的兩端 Pipe 方法返回(conn1,conn2)代表一個管道的兩個端,Pipe 方法有 duplex 參數(shù),默認為 True ,即全雙工模式,若為 FALSE ,conn1 只負責接收信息,conn2 負責發(fā)送, Pipe 同樣也包含兩個方法:
send : 發(fā)送信息;
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 #寫數(shù)據(jù)進程執(zhí)行的代碼 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())#讀數(shù)據(jù)進程的代碼 def proc_recv(pipe):while True:print('Process rev:%s' %pipe.recv())time.sleep(random.random())if __name__ == '__main__':#父進程創(chuàng)建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 timedef 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 startself._popen = self._Popen(self)File "G:\ProgramData\Anaconda3\lib\multiprocessing\context.py", line 223, in _Popenreturn _default_context.get_context().Process._Popen(process_obj)File "G:\ProgramData\Anaconda3\lib\multiprocessing\context.py", line 322, in _Popenreturn 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 dumpForkingPickler(file, protocol).dump(obj) TypeError: can't pickle _thread.lock objects '''四.猜你喜歡
未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? Python 進程間通信 Queue / Pipe
[喜歡(1)](javascript:😉 [打賞](javascript:😉
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的Python 进程间通信 Queue / Pipe - Python零基础入门教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BugkuCTF-WEB题你从哪里来
- 下一篇: Python oct 函数 - Pyth