Python程序間通訊Queue訊息佇列用法分析

2022-09-29 21:51:16 字數 4258 閱讀 7824

程序間通訊-queue

process之間有時需要通訊,作業系統提供了很多機制來實現程序間的通訊。

1. queue的使用

可以使用multiprocessing模組的queue實現多程序之間的資料傳遞,queue本身是乙個訊息列隊程式,首先用乙個小例項來演示下queue的工作原理:

**如下:

#coding=utf-8

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會立刻丟擲異常

try:

q.put('訊息4', true, 2)

except:

print('訊息佇列已滿,現有訊息數量:%s'%q.qsize())

try:

q.put_nowait('訊息4')#等同於q.put('訊息4', false)

except:

print('訊息佇列已滿,現有訊息數量:%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())

執行結果:

程式設計客棧false

true

訊息佇列已滿,現有訊息數量:3

訊息佇列已滿,現有訊息數量:3

訊息1訊息2

訊息3說明

初始化queue()物件時(例如:q=queue()),若括號中沒有指定最大可接收的訊息數量,或數量為負值,那麼就代表可接受的訊息數量沒有上限(直到記憶體的盡頭);

queue.qsize():返回當前佇列包含的訊息數量;

queue.empty():如果隊列為空,返回true,反之false ;

queue.full():如果佇列滿了,返回true,反之false;

queue.get([block[, timeout]]):獲取佇列中的一條訊息,然後將其從列隊www.cppcns.com中移除,block預設值為true;

1)如果block使用預設值,且沒有設定timeout(單位秒),訊息列隊如果為空,此時程式將被阻塞(停在讀取狀態),直到從訊息列隊讀到訊息為止,如果設定了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使用預設值,且沒有設定timeout(單位秒),訊息列隊如果已經沒有空間可寫入,此時程式將被阻塞(停在寫⼊狀態),直到從訊息列隊騰出空間為止。如果設定了timeout,則會等待timeout秒,若還沒空間,則丟擲」queue.full」異常;

2)如果block值為false,訊息列隊如果沒有空間可寫入則會立刻丟擲」queue.full」異常;

queue.put_nowait(item):相當queue.put(item, false);

2. queue例項

我們以queue為例,在子程序中建立兩個子程序,乙個往queue中寫資料,乙個從queue中讀資料:

#coding=utf-8

from multiprocessing import queue, process

import time, random, os

#寫資料程序執行的**

def write(q):

l1 = ['a','b','c']

for value in l1:

print('put %s to queue...'%value)

q.put(value)

time.sleep(random.random())

#讀資料執行的**

def read(q):

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__":

#父程序建立queue,並傳給各個子程序

q = queue()

qw = process(target=write, args=(q,))

qr = proce args=(q,))

#啟動子程序qw寫入

qw.start()

程式設計客棧 qw.join()

# 啟動子程序qr寫入

qr.start()

qr.join()

# qr程序是死迴圈,無法等待其結束,只能強行終止:

print('所有資料都已經寫入並讀取完畢')

執行結果:

put a to queue...

put b to queue...

put c to queue...

get a from queue...

get b from queue...

get c from queue...

所有資料都已經寫入並讀取完畢

3. 程序池中的queue

如果要使用pool建立程序,就需要使用multiprocessing.manager()中的queue(),而不是multiprocessing.queue(),否則會得到一條如下的錯誤資訊:

runtimeerror: queue objects should only be shared between processes

through inheritance.

下面的例項演示了程序池中的程序如何通訊:

**如下:

#coding=utf-8

from multiprocessing import manageokkemgr, pool

import time, random, os

def writer(q):

print('writer啟動%s,父程序為%s'%(os.getpid(),os.getppid()))

l1 = ['a','b','c','d','e']

for value in l1:

q.put(value)

def reader(q):

print('reader啟動%s,父程序為%s'%(os.getpid(),os.getppid()))

for i in range(q.qsize()):

print('reader從queue獲取到訊息:%s'%q.get(true))

if __name__ == "__main__":

print('父程序%s啟動...'%os.getpid())

q = manager().queue() #使用manager中的queue來初始化

po = pool()

# 使用阻塞模式建立程序,這樣就不需要在reader中使用死迴圈了,可以讓writer完全執行完成後,再用reader去讀取

po.apply(writer, (q,))

po.apply(reader, (q,))

po.close()

po.join()

print('%s結束'%os.getpid())

執行結果:

父程序7415啟動...

writer啟動7421,父程序為7415

reader啟動7422, 父程序為7415

reader從queue獲取到訊息:a

reader從queue獲取到訊息:b

reader從queue獲取到訊息:c

reader從queue獲取到訊息:d

reader從queue獲取到訊息:e

7415結束

Python多程序 程序間通訊

1.使用multiprocessing模組建立的程序之間的通訊 coding utf 8 queue類常用屬性和方法 init self,maxsize 1 qsize full empty put obj,block true,timeout none put nowait obj get blo...

Python基礎 程序間通訊

程序間通訊 windows下程序間通訊有很多種,例如 訊息佇列 共享記憶體 管道等等。python的multiprocessing模組包裝了底層的機制,提供了queue pipes等多種方式來交換資料。multiprocessing.pipe 即管道模式,呼叫pipe 返回管道的兩端的connect...

python中程序間通訊

程序間通訊 磁碟互動 速度慢 不安全 socket 本地套接字 管道 訊息列隊 共享記憶體 訊號 訊號量 套接字 管道通訊 pipe 在記憶體中開闢一塊空間,對多個程序可見,通過管道 多個程序進行通訊 multiprocessing pipe fd1,fd2 pipe duplex true 功能 ...