溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python實(shí)現(xiàn)隊(duì)列同步的方法是什么

發(fā)布時(shí)間:2020-08-06 09:45:08 來(lái)源:億速云 閱讀:146 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下Python實(shí)現(xiàn)隊(duì)列同步的方法是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

隊(duì)列

q = Queue.Queue(maxsize = 10) 創(chuàng)建一個(gè)“隊(duì)列”對(duì)象。Queue.Queue類即是一個(gè)隊(duì)列的同步實(shí)現(xiàn)。隊(duì)列長(zhǎng)度可為無(wú)限或者有限??赏ㄟ^(guò)Queue的構(gòu)造函數(shù)的可選參數(shù)maxsize來(lái)設(shè)定隊(duì)列長(zhǎng)度。如果maxsize小于1就表示隊(duì)列長(zhǎng)度無(wú)限。

q.put()方法在隊(duì)尾插入一個(gè)項(xiàng)目。put()有兩個(gè)參數(shù),第一個(gè)item為必需的,為插入項(xiàng)目的值;第二個(gè)block為可選參數(shù),默認(rèn)為1。如果隊(duì)列當(dāng)前為空且block為1,put()方法就使調(diào)用線程暫停,直到空出一個(gè)數(shù)據(jù)單元。如果block為0,put方法將引發(fā)Full異常。

q.get([block[, timeout]])方法從隊(duì)頭刪除并返回一個(gè)項(xiàng)目??蛇x參數(shù)為block,默認(rèn)為True。如果隊(duì)列為空且block為True,get()就使調(diào)用線程暫停,直至有項(xiàng)目可用。如果隊(duì)列為空且block為False,隊(duì)列將引發(fā)Empty異常,timeout等待時(shí)間。

q.qsize() 返回隊(duì)列的大小

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

q.full() 如果隊(duì)列滿了,返回True,反之False

q.full 與 maxsize 大小對(duì)應(yīng)

q.get_nowait() 相當(dāng)q.get(False)

q.put_nowait(item) 相當(dāng)q.put(item, False)

q.task_done() 在完成一項(xiàng)工作之后,q.task_done() 函數(shù)向任務(wù)已經(jīng)完成的隊(duì)列發(fā)送一個(gè)信號(hào)

q.join() 實(shí)際上意味著等到隊(duì)列為空,再執(zhí)行別的操作

import queue
d = queue.Queue()
d.put('1')
d.put('2')
d.put('3')
print(d.get())
print(d.get())
print(d.get())
print(d.get())
print(d.get(0))

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

1
2
3

報(bào)錯(cuò):

queue.Empty

線程操作列表是不安全的。

import threading, time
li = [1, 2, 3, 4, 5]
def pri():
    while li:
        a = li [-1]
        print(a)
        time.sleep(1)
        try:
            li.remove(a)
        except:
            print('-----', a)
t1 = threading.Thread(target=pri, args=())
t1.start()
t2 = threading.Thread(target=pri, args=())
t2.start()

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

5
5
4
----- 5
4
3
----- 4
3
2
----- 3
2
1
----- 2
1
----- 1
import threading, queue
from time import sleep
from random import randint
class Production(threading.Thread):
    def run(self):
        while True:
            r = randint(0, 100)
            q.put(r)
            print("生產(chǎn)出來(lái) %s 號(hào)包子" %r)
            sleep(1)
class Proces(threading.Thread):
    def run(self):
        while True:
            re = q.get()
            print('吃掉 %s號(hào)包子' %re)
if __name__ == '__main__':
    q = queue.Queue(10)
    threads = [Production(),Production(),Production(),Proces()]
    for t in threads:
        t.start()

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

生產(chǎn)出來(lái) 94 號(hào)包子
生產(chǎn)出來(lái) 13 號(hào)包子
生產(chǎn)出來(lái) 79 號(hào)包子
吃掉 94號(hào)包子
吃掉 13號(hào)包子
吃掉 79號(hào)包子
生產(chǎn)出來(lái) 43 號(hào)包子
吃掉 43號(hào)包子
生產(chǎn)出來(lái) 32 號(hào)包子
吃掉 32號(hào)包子
......

看完了這篇文章,相信你對(duì)Python實(shí)現(xiàn)隊(duì)列同步的方法是什么有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI