Python 進程間通信 Queue / Pipe - Python零基礎入門教程


目錄

零基礎 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
'''

四.猜你喜歡

  1. Python 條件推導式
  2. Python 列表推導式
  3. Python 字典推導式
  4. Python 不定長參數 *argc/**kargcs
  5. Python 匿名函數 lambda
  6. Python return 邏輯判斷表達式
  7. Python is 和 == 區別
  8. Python 可變數據類型和不可變數據類型
  9. Python 淺拷貝和深拷貝
  10. Python 異常處理
  11. Python 線程創建和傳參
  12. Python 線程互斥鎖 Lock
  13. Python 線程時間 Event
  14. Python 線程條件變量 Condition
  15. Python 線程定時器 Timer
  16. Python 線程信號量 Semaphore
  17. Python 線程障礙對象 Barrier
  18. Python 線程隊列 Queue – FIFO
  19. Python 線程隊列 LifoQueue – LIFO
  20. Python 線程優先隊列 PriorityQueue
  21. Python 線程池 ThreadPoolExecutor(一)
  22. Python 線程池 ThreadPoolExecutor(二)
  23. Python 進程 Process 模塊
  24. Python 進程 Process 與線程 threading 區別
  25. Python 進程間通信 Queue / Pipe

未經允許不得轉載:猿說編程 » Python 進程間通信 Queue / Pipe

[喜歡(1)](javascript:😉 [打賞](javascript:😉

本文由博客 - 猿說編程 猿說編程 發布!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM