目錄
零基礎 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:😉 [打賞](javascript:😉
本文由博客 - 猿說編程 猿說編程 發布!
