python訊息佇列Queue

2021-10-16 07:36:51 字數 3598 閱讀 6346

例項1:訊息佇列queue,不要將檔案命名為「queue.py」,否則會報異常「importerror: cannot import name 『queue』」

#coding=utf-8

from multiprocessing import queue

q = queue(3)

#初始化乙個queue物件,最多可接收三條put訊息

q.put(

'message-1'

)q.put(

'message-2'

)print

(q.full())

#false,是否滿了

q.put(

'message-3'

)print

(q.full())

#true

#因為訊息佇列已滿,下面的try都會丟擲異常,第乙個try會等待2秒後再丟擲異常,第二個try會立即丟擲異常

try:

q.put(

'message-4'

,true,2

)except

:print

('except1,訊息佇列已滿,現有訊息數量:%s'

%q.qsize())

try:

q.put_nowait(

'message-4'

)except

:print

('except2,訊息佇列已滿,現有訊息數量:%s'

%q.qsize())

#判斷佇列是否已滿

ifnot q.full():

q.put_nowait(

'message-4'

)#讀取訊息時,先判斷訊息佇列是否為空,在讀取

ifnot q.empty():

for i in

range

(q.qsize())

:print

(q.get())

#q.get會阻塞,q.get_nowait()不阻塞,但會拋異常

false

true

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

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

message-1

message-2

message-3

例項二:通過process程序間通訊

from multiprocessing import process,queue

import os,time,random

#寫資料

defwrite

(q):

for value in

['a'

,'b'

,'c']:

print

('put %s to queue...'

%value)

q.put(value)

time.sleep(random.random())

#讀資料

defread

(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__'

:print

('start...'

) q = queue(

)#父程序的queue傳遞給子程序

pw = process(target=write,args=

(q,)

) pr = process(target=read,args=

(q,)

)#寫程序

pw.start(

) pw.join(

)#讀程序

pr.start(

) pr.join(

)print

('done...'

)

start…

put a to queue…

put b to queue…

put c to queue…

get a from queue…

get b from queue…

get c from queue…

done…

例項三:通過manager程序間通訊

from multiprocessing import manager,pool

import os,time,random

#寫資料

defwriter

(q):

print

('writer啟動(%s),父程序為(%s)'

%(os.getpid(

),os.getppid())

)for i in

'chaoge'

: q.put(i)

#讀資料

defreader

(q):

print

('reader啟動(%s),父程序為(%s)'

%(os.getpid(

),os.getppid())

)for i in

range

(q.qsize())

:print

('reader 從queue獲取到訊息:%s'

%q.get())

if __name__ ==

'__main__'

:print

('(%s) start'

%os.getpid())

q = manager(

).queue(

)#使用manager中的queue來初始化

po=pool(

)#使用阻塞模式建立程序,這樣就不需要再reader中使用死迴圈了,可以等write執行完成後,再用reader

po.(writer,

(q,)

) po.

(reader,

(q,)

)#寫程序

po.close(

) po.join(

)print

('(%s) end'

%os.getpid(

))

(7720) start

writer啟動(7284),父程序為(7720)

reader啟動(8712),父程序為(7720)

reader 從queue獲取到訊息:c

reader 從queue獲取到訊息:h

reader 從queue獲取到訊息:a

reader 從queue獲取到訊息:o

reader 從queue獲取到訊息:g

reader 從queue獲取到訊息:e

(7720) end

Queue訊息佇列實戰python

網上很關於queue的教程都只是個簡單的demo,看完也還是不知道怎麼在實戰中運用,下面的 是在用flask開發自動化測試平台時,用到的有關queue的 首先,在使用者介面所在的user.py檔案中匯入queue庫,並例項化為q 同時新建乙個thread子執行緒,這個執行緒提供功能是消費執行緒,可以...

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

程序間通訊 queue process之間有時需要通訊,作業系統提供了很多機制來實現程序間的通訊。1.queue的使用 可以使用multiprocessing模組的queue實現多程序之間的資料傳遞,queue本身是乙個訊息列隊程式,首先用乙個小例項來演示下queue的工作原理 如下 coding ...

queue之 單向訊息佇列

import queue q queue.queue 建立乙個單項佇列 qsize 檢視這個單項佇列元素的個數 empty 與 clear功能是一樣的 full 是用來檢視這個佇列是否填滿了,佇列可以定義佇列的個數,所以可以通過full來檢視佇列是否填滿了 put 插入 資料 get 取資料 imp...