目錄
- 一.前言
- 1.使用 Queue 執行緒間通信
- 2.使用 Queue 行程間通信,適用于多個行程之間通信
- 3.使用 Pipe 行程間通信,適用于兩個行程之間通信(一對一)
- 二.python 行程間通信 Queue/Pipe 使用
- 1.使用 Queue 行程間通信
- 2.使用 Pipe 行程間通信
- 三.測驗 queue.Queue 來完成行程間通信能否成功?
- 四.猜你喜歡
零基礎 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:??
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288844.html
標籤:Python
上一篇:python 演算法 一
