最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python通過(guò)隊(duì)列來(lái)實(shí)現(xiàn)進(jìn)程間通信的示例

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

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

我們來(lái)看一個(gè)例子:

from multiprocessing import Process
import os
import time

nums = [11, 22]


def work1():
  """子進(jìn)程要執(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():
  """子進(jìn)程要執(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()

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

運(yùn)行結(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]

通過(guò)隊(duì)列完成進(jìn)程間通信

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

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

Queue 本身是一個(gè)消息隊(duì)列程序,首先用一個(gè)小實(shí)例來(lái)演示一下 Queue 的工作原理:

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

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

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

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

運(yùn)行結(jié)果:

隊(duì)列 Queue 的使用說(shuō)明

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

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

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

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

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

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

Queue.get_nowait():相當(dāng) Queue.get(False)。

Queue.put(item,[block[, timeout]]):將 item 消息寫(xiě)入隊(duì)列,block 默認(rèn)值為 True。

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

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

Queue實(shí)例

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

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


def write(q):
  # 寫(xiě)數(shù)據(jù)進(jìn)程執(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ù)進(jìn)程執(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__':
  # 父進(jìn)程創(chuàng)建Queue,并傳給各個(gè)子進(jìn)程:
  q = Queue()
  pw = Process(target=write, args=(q,))
  pr = Process(target=read, args=(q,))
  # 啟動(dòng)子進(jìn)程pw,寫(xiě)入:
  pw.start()
  # 等待pw結(jié)束:
  pw.join()
  # 啟動(dòng)子進(jìn)程pr,讀取:
  pr.start()
  pr.join()
  print('')
  print('所有數(shù)據(jù)都寫(xiě)入并且讀完')

運(yùn)行結(jié)果:

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

相關(guān)文章

  • 淺談Python中的私有變量

    淺談Python中的私有變量

    本篇文章給大家講述了Python中的私有變量相關(guān)的知識(shí)點(diǎn)內(nèi)容,學(xué)習(xí)后大家會(huì)對(duì)私有變量有更系統(tǒng)的了解。
    2018-02-02
  • 基于Python實(shí)現(xiàn)文章信息統(tǒng)計(jì)的小工具

    基于Python實(shí)現(xiàn)文章信息統(tǒng)計(jì)的小工具

    及時(shí)的統(tǒng)計(jì)可以更好的去分析讀者對(duì)于內(nèi)容的需求,了解文章內(nèi)容的價(jià)值,以及從側(cè)面認(rèn)識(shí)自己在知識(shí)創(chuàng)作方面的能力。本文就來(lái)用Python制作一個(gè)文章信息統(tǒng)計(jì)的小工具?,希望對(duì)大家有所幫助
    2023-02-02
  • 一小時(shí)學(xué)會(huì)TensorFlow2之基本操作1實(shí)例代碼

    一小時(shí)學(xué)會(huì)TensorFlow2之基本操作1實(shí)例代碼

    這篇文章主要介紹了TensorFlow2的基本操作第一節(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • python循環(huán)語(yǔ)句的使用方法

    python循環(huán)語(yǔ)句的使用方法

    這篇文章主要介紹了python循環(huán)語(yǔ)句的使用方法,文章主要介紹python循環(huán)相關(guān)內(nèi)容有?for循環(huán)語(yǔ)句、循環(huán)嵌套、break結(jié)束循環(huán)、continue跳過(guò)本次循環(huán)實(shí)現(xiàn)內(nèi)容,需要的小伙伴可以參考一下
    2022-04-04
  • python剪切視頻與合并視頻的實(shí)現(xiàn)

    python剪切視頻與合并視頻的實(shí)現(xiàn)

    這篇文章主要介紹了python剪切視頻與合并視頻的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 詳解Python函數(shù)作用域的LEGB順序

    詳解Python函數(shù)作用域的LEGB順序

    這篇文章主要為大家詳細(xì)介紹了Python函數(shù)作用域的LEGB順序的相關(guān)資料,感興趣的朋友可以參考一下
    2016-05-05
  • python更換國(guó)內(nèi)鏡像源三種實(shí)用方法

    python更換國(guó)內(nèi)鏡像源三種實(shí)用方法

    這篇文章主要給大家介紹了關(guān)于python更換國(guó)內(nèi)鏡像源三種實(shí)用方法的相關(guān)資料,更換Python鏡像源可以幫助解決使用pip安裝包時(shí)速度過(guò)慢或無(wú)法連接的問(wèn)題,需要的朋友可以參考下
    2023-09-09
  • Python3環(huán)境安裝Scrapy爬蟲(chóng)框架過(guò)程及常見(jiàn)錯(cuò)誤

    Python3環(huán)境安裝Scrapy爬蟲(chóng)框架過(guò)程及常見(jiàn)錯(cuò)誤

    這篇文章主要介紹了Python3環(huán)境安裝Scrapy爬蟲(chóng)框架過(guò)程及常見(jiàn)錯(cuò)誤 ,本文給大家介紹的非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python 多線程并行執(zhí)行的實(shí)現(xiàn)示例

    Python 多線程并行執(zhí)行的實(shí)現(xiàn)示例

    本文主要介紹了Python 多線程并行執(zhí)行的實(shí)現(xiàn)示例,通過(guò)使用threading和concurrent.futures模塊可以進(jìn)行實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • 在PyCharm的 Terminal(終端)切換Python版本的方法

    在PyCharm的 Terminal(終端)切換Python版本的方法

    這篇文章主要介紹了在PyCharm的 Terminal(終端)切換Python版本的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論

荥阳市| 东丽区| 柳河县| 和静县| 赤水市| 本溪市| 崇信县| 昭平县| 手游| 惠来县| 宜黄县| 西林县| 穆棱市| 马尔康县| 衢州市| 镇平县| 湘西| 平遥县| 正安县| 新安县| 扶沟县| 樟树市| 天祝| 梅河口市| 青田县| 弥渡县| 武功县| 渝中区| 耒阳市| 上饶县| 巫溪县| 霍邱县| 元谋县| 杭锦后旗| 新丰县| 绵竹市| 沙湾县| 贺州市| 红原县| 交口县| 登封市|