欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python通過隊列來實現(xiàn)進程間通信的示例

 更新時間:2020年10月14日 09:45:27   作者:小名叫小明  
這篇文章主要介紹了Python通過隊列來實現(xiàn)進程間通信的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

Python程序中,在進程和進程之間是不共享全局變量的數(shù)據(jù)的。

我們來看一個例子:

from multiprocessing import Process
import os
import time

nums = [11, 22]


def work1():
  """子進程要執(zhí)行的代碼"""
  print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
  for i in range(3):
    nums.append(i)
    time.sleep(1)
    print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))


def work2():
  """子進程要執(zhí)行的代碼"""
  print("in process2 pid=%d ,nums=%s" % (os.getpid(), nums))


if __name__ == '__main__':
  p1 = Process(target=work1)
  p1.start()
  p1.join()

  p2 = Process(target=work2)
  p2.start()

進程 p1 里對全局變量 nums 循環(huán)進行處理,進程 p2 將 nums 打印出來,發(fā)現(xiàn) nums 的值沒有變化。

運行結(jié)果:

in process1 pid=5788 ,nums=[11, 22]
in process1 pid=5788 ,nums=[11, 22, 0]
in process1 pid=5788 ,nums=[11, 22, 0, 1]
in process1 pid=5788 ,nums=[11, 22, 0, 1, 2]
in process2 pid=11832 ,nums=[11, 22]

通過隊列完成進程間通信

但是進程(Process)之間有時需要通信,操作系統(tǒng)提供了很多機制來實現(xiàn)進程間的通信。

可以使用 multiprocessing 模塊的 Queue 實現(xiàn)多進程之間的數(shù)據(jù)傳遞。

Queue 本身是一個消息隊列程序,首先用一個小實例來演示一下 Queue 的工作原理:

from multiprocessing import Queue
# 初始化一個Queue對象,最多可接收三條put消息
q = Queue(3) 
q.put("消息1")
q.put("消息2")
print(q.full()) # False
q.put("消息3")
print(q.full()) # True

# 因為消息隊列已滿下面的try都會拋出異常
# 第一個try會等待2秒后再拋出異常
try:
  q.put("消息4", True, 2)
except:
  print("消息隊列已滿,現(xiàn)有消息數(shù)量:%s" % q.qsize())
# 第二個Try會立刻拋出異常
try:
  q.put_nowait("消息4")
except:
  print("消息列隊已滿,現(xiàn)有消息數(shù)量:%s" % q.qsize())

# 推薦的方式,先判斷消息列隊是否已滿,再寫入
if not q.full():
  q.put_nowait("消息4")

# 讀取消息時,先判斷消息列隊是否為空,再讀取
if not q.empty():
  for i in range(q.qsize()):
    print(q.get_nowait())

運行結(jié)果:

隊列 Queue 的使用說明

初始化 Queue()對象時(例如:q=Queue()),若括號中沒有指定最大可接收的消息數(shù)量,或數(shù)量為負值,那么就代表可接受的消息數(shù)量沒有上限(直到內(nèi)存的盡頭)。

Queue.qsize():返回當前隊列包含的消息數(shù)量。

Queue.empty():如果隊列為空,返回True,反之False。

Queue.full():如果隊列滿了,返回True,反之False。

Queue.get([block[, timeout]]):獲取隊列中的一條消息,然后將其從列隊中移除,block 默認值為 True。

  1. 如果 block 使用默認值,且沒有設(shè)置 timeout(單位秒),消息隊列如果為空,此時程序?qū)⒈蛔枞?,停在讀取狀態(tài),直到從消息隊列讀到消息為止;如果設(shè)置了 timeout,則會等待 timeout 秒,若還沒讀取到任何消息,則拋出 "Queue.Empty" 異常。
  2. 如果 block 值為 False,消息列隊如果為空,則會立刻拋出 "Queue.Empty" 異常。

Queue.get_nowait():相當 Queue.get(False)。

Queue.put(item,[block[, timeout]]):將 item 消息寫入隊列,block 默認值為 True。

  1. 如果 block 使用默認值,且沒有設(shè)置 timeout(單位秒),消息隊列如果已經(jīng)沒有空間可寫入,此時程序?qū)⒈蛔枞?,停在寫入狀態(tài),直到從消息隊列騰出空間為止;如果設(shè)置了timeout,則會等待 timeout 秒,若還沒空間,則拋出 "Queue.Full" 異常。
  2. 如果 block 值為 False,消息隊列如果沒有空間可寫入,則會立刻拋出 "Queue.Full" 異常。

Queue.put_nowait(item):相當Queue.put(item, False)。

Queue實例

我們以 Queue 為例,在父進程中創(chuàng)建兩個子進程,一個往 Queue 里寫數(shù)據(jù),一個從 Queue 里讀數(shù)據(jù)。

from multiprocessing import Process, Queue
import os
import time
import random


def write(q):
  # 寫數(shù)據(jù)進程執(zhí)行的代碼:
  for value in ['A', 'B', 'C']:
    print('Put %s to queue...' % value)
    q.put(value)
    time.sleep(random.random())


def read(q):
  # 讀數(shù)據(jù)進程執(zhí)行的代碼:
  while True:
    if not q.empty():
      value = q.get(True)
      print('Get %s from queue.' % value)
      time.sleep(random.random())
    else:
      break


if __name__ == '__main__':
  # 父進程創(chuàng)建Queue,并傳給各個子進程:
  q = Queue()
  pw = Process(target=write, args=(q,))
  pr = Process(target=read, args=(q,))
  # 啟動子進程pw,寫入:
  pw.start()
  # 等待pw結(jié)束:
  pw.join()
  # 啟動子進程pr,讀取:
  pr.start()
  pr.join()
  print('')
  print('所有數(shù)據(jù)都寫入并且讀完')

運行結(jié)果:

以上就是Python通過隊列來實現(xiàn)進程間通信的示例的詳細內(nèi)容,更多關(guān)于python實現(xiàn)進程間通信的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 新手學習Python2和Python3中print不同的用法

    新手學習Python2和Python3中print不同的用法

    在本篇文章里小編給大家分享的是關(guān)于Python2和Python3中print不同的用法,有興趣的朋友們可以學習下。
    2020-06-06
  • 在Python中處理日期和時間的基本知識點整理匯總

    在Python中處理日期和時間的基本知識點整理匯總

    這篇文章主要介紹了在Python中處理日期和時間的基本知識點整理匯總,是Python入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • pytorch多GPU并行運算的實現(xiàn)

    pytorch多GPU并行運算的實現(xiàn)

    這篇文章主要介紹了pytorch多GPU并行運算的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Python中的作用域規(guī)則詳解

    Python中的作用域規(guī)則詳解

    這篇文章主要介紹了Python中的作用域規(guī)則詳解了局部作用域、全局作用域、內(nèi)置作用域、嵌套作用域等內(nèi)容,本文講解了,需要的朋友可以參考下
    2015-01-01
  • django做form表單的數(shù)據(jù)驗證過程詳解

    django做form表單的數(shù)據(jù)驗證過程詳解

    這篇文章主要介紹了django做form表單的數(shù)據(jù)驗證過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Python實現(xiàn)的rsa加密算法詳解

    Python實現(xiàn)的rsa加密算法詳解

    這篇文章主要介紹了Python實現(xiàn)的rsa加密算法,結(jié)合完整實例形式分析了Python實現(xiàn)rsa加密算法的原理、步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 對django的User模型和四種擴展/重寫方法小結(jié)

    對django的User模型和四種擴展/重寫方法小結(jié)

    今天小編就為大家分享一篇對django的User模型和四種擴展/重寫方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 總結(jié)Python使用過程中的bug

    總結(jié)Python使用過程中的bug

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著Python使用過程中的bug展開,文中有非常詳細的介紹,需要的朋友可以參考下
    2021-06-06
  • 快速解決pymongo操作mongodb的時區(qū)問題

    快速解決pymongo操作mongodb的時區(qū)問題

    這篇文章主要介紹了快速解決pymongo操作mongodb的時區(qū)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Python中tkinter庫的簡單使用

    Python中tkinter庫的簡單使用

    這篇文章主要介紹了Python中tkinter庫的簡單使用,Tkinter是Python中常用的GUI庫,它使用Tk GUI工具包,并提供了創(chuàng)建各種GUI應(yīng)用程序的功能,需要的朋友可以參考下
    2023-10-10

最新評論