目錄
零基礎(chǔ) Python 學(xué)習(xí)路線推薦 : Python 學(xué)習(xí)目錄 >> Python 基礎(chǔ)入門
一.前言
1.在前一篇文章 Python 進(jìn)程 Process 與線程 threading 區(qū)別 中講到線程 threading 共享內(nèi)存地址诡宗,進(jìn)程與進(jìn)程 Peocess 之間相互獨(dú)立,互不影響(相當(dāng)于深拷貝)击儡;
2.在線程間通信的時候可以使用 Queue 模塊完成塔沃,進(jìn)程間通信也可以通過 Queue 完成,但是此 Queue 并非線程的 Queue 阳谍,進(jìn)程間通信 Queue 是將數(shù)據(jù) pickle 后傳給另一個進(jìn)程的 Queue蛀柴,用于父進(jìn)程與子進(jìn)程之間的通信或同一父進(jìn)程的子進(jìn)程之間通信;
1.使用 Queue 線程間通信
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿說編程
@Blog(個人博客地址): www.codersrc.com
@File:Python 進(jìn)程間通信 Queue / Pipe.py
@Time:2021/05/09 07:37
@Motto:不積跬步無以至千里矫夯,不積小流無以成江海鸽疾,程序人生的精彩需要堅(jiān)持不懈地積累!
"""
#導(dǎo)入線程相關(guān)模塊
import threading
import queue
q = queue.Queue()
2.使用 Queue 進(jìn)程間通信训貌,適用于多個進(jìn)程之間通信
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿說編程
@Blog(個人博客地址): www.codersrc.com
@File:Python 進(jìn)程間通信 Queue / Pipe.py
@Time:2021/05/09 07:37
@Motto:不積跬步無以至千里制肮,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累递沪!
"""
# 導(dǎo)入進(jìn)程相關(guān)模塊
from multiprocessing import Process
from multiprocessing import Queue
q = Queue()
3.使用 Pipe 進(jìn)程間通信豺鼻,適用于兩個進(jìn)程之間通信(一對一)
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿說編程
@Blog(個人博客地址): www.codersrc.com
@File:Python 進(jìn)程間通信 Queue / Pipe.py
@Time:2021/05/09 07:37
@Motto:不積跬步無以至千里,不積小流無以成江海区拳,程序人生的精彩需要堅(jiān)持不懈地積累拘领!
"""
# 導(dǎo)入進(jìn)程相關(guān)模塊
from multiprocessing import Process
from multiprocessing import Pipe
pipe = Pipe()
二.python 進(jìn)程間通信 Queue/Pipe 使用
Python 提供了多種進(jìn)程通信的方式,主要 Queue 和 Pipe 這兩種方式樱调,Queue 用于多個進(jìn)程間實(shí)現(xiàn)通信约素,Pipe 用于兩個進(jìn)程的通信;
1.使用 Queue 進(jìn)程間通信
- put :以插入數(shù)據(jù)到隊(duì)列中笆凌,他還有兩個可選參數(shù):blocked 和 timeout 圣猎。詳情自行百度
- get :從隊(duì)列讀取并且刪除一個元素。同樣還有兩個可選參數(shù):blocked 和 timeout , 詳情自行百度
# !usr/bin/env python
# -\_- coding:utf-8 \_\_-
"""
@Author:猿說編程
@Blog(個人博客地址): www.codersrc.com
@File:Python 進(jìn)程間通信 Queue / Pipe.py
@Time:2021/05/09 07:37
@Motto:不積跬步無以至千里乞而,不積小流無以成江海送悔,程序人生的精彩需要堅(jiān)持不懈地積累!
"""
from multiprocessing import Process
from multiprocessing import Queue
import os,time,random
#寫數(shù)據(jù)進(jìn)程執(zhí)行的代碼
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())
#讀數(shù)據(jù)進(jìn)程的代碼
def proc_read(q):
print('Process is reading...')
while True:
url = q.get(True)
print('Get %s from queue' %url)
if **name** == '**main**': #父進(jìn)程創(chuàng)建 Queue爪模,并傳給各個子進(jìn)程
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,)) #啟動子進(jìn)程欠啤,寫入
proc_write1.start()
proc_write2.start()
proc_reader.start()
#等待proc_write1結(jié)束
proc_write1.join()
proc_write2.join()
#proc_raader進(jìn)程是死循環(huán),強(qiáng)制結(jié)束
proc_reader.terminate()
print("mian")
'''
輸出結(jié)果:
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 進(jìn)程間通信
Pipe 常用于兩個進(jìn)程屋灌,兩個進(jìn)程分別位于管道的兩端 Pipe 方法返回(conn1,conn2)代表一個管道的兩個端洁段,Pipe 方法有 duplex 參數(shù),默認(rèn)為 True 共郭,即全雙工模式祠丝,若為 FALSE ,conn1 只負(fù)責(zé)接收信息除嘹,conn2 負(fù)責(zé)發(fā)送, Pipe 同樣也包含兩個方法:
send : 發(fā)送信息;
recv : 接收信息;
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿說編程
@Blog(個人博客地址): www.codersrc.com
@File:Python 進(jìn)程間通信 Queue / Pipe.py
@Time:2021/05/09 07:37
@Motto:不積跬步無以至千里写半,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累尉咕!
"""
from multiprocessing import Process
from multiprocessing import Pipe
import os,time,random
#寫數(shù)據(jù)進(jìn)程執(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ù)進(jìn)程的代碼
def proc_recv(pipe):
while True:
print('Process rev:%s' %pipe.recv())
time.sleep(random.random())
if __name__ == '__main__':
#父進(jìn)程創(chuàng)建pipe叠蝇,并傳給各個子進(jìn)程
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],))
#啟動子進(jìn)程,寫入
p1.start()
p2.start()
p1.join()
p2.terminate()
print("mian")
'''
輸出結(jié)果:
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 來完成進(jìn)程間通信能否成功年缎?
當(dāng)然我們也可以嘗試使用線程 threading 的 Queue 是否能完成線程間通信悔捶,示例代碼如下:
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿說編程
@Blog(個人博客地址): www.codersrc.com
@File:Python 進(jìn)程間通信 Queue / Pipe.py
@Time:2021/05/09 07:37
@Motto:不積跬步無以至千里,不積小流無以成江海晦款,程序人生的精彩需要堅(jiān)持不懈地積累炎功!
"""
from multiprocessing import Process
# from multiprocessing import Queue # 進(jìn)程間通信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()
'''
直接異常報(bào)錯:
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 條件推導(dǎo)式
- Python 列表推導(dǎo)式
- Python 字典推導(dǎo)式
- Python 不定長參數(shù) *argc/**kargcs
- Python 匿名函數(shù) lambda
- Python return 邏輯判斷表達(dá)式
- Python is 和 == 區(qū)別
- Python 可變數(shù)據(jù)類型和不可變數(shù)據(jù)類型
- Python 淺拷貝和深拷貝
- Python 異常處理
- Python 線程創(chuàng)建和傳參
- Python 線程互斥鎖 Lock
- Python 線程時間 Event
- Python 線程條件變量 Condition
- Python 線程定時器 Timer
- Python 線程信號量 Semaphore
- Python 線程障礙對象 Barrier
- Python 線程隊(duì)列 Queue – FIFO
- Python 線程隊(duì)列 LifoQueue – LIFO
- Python 線程優(yōu)先隊(duì)列 PriorityQueue
- Python 線程池 ThreadPoolExecutor(一)
- Python 線程池 ThreadPoolExecutor(二)
- Python 進(jìn)程 Process 模塊
- Python 進(jìn)程 Process 與線程 threading 區(qū)別
- Python 進(jìn)程間通信 Queue / Pipe
未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? Python 進(jìn)程間通信 Queue / Pipe
[喜歡(1)](javascript:?? [打賞](javascript:??
本文由博客 - 猿說編程 猿說編程 發(fā)布蛇损!