91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python隊列的使用方法有哪些

發布時間:2023-05-04 09:56:04 來源:億速云 閱讀:106 作者:iii 欄目:開發技術

今天小編給大家分享一下Python隊列的使用方法有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

python中使用到的隊列模塊大致有三個:

1、from queue import Queue

此模塊適用于線程間通信,但不能用于進程間通信。

示例代碼1: 【注意:此時代碼存在錯誤!!!】

import time
import threading
from queue import Queue
def task_func():
    global queue
    while queue.qsize() > 0:
        x = queue.get()
        print(f"num: {x}")
        time.sleep(0.1)
def producer_data():
    global queue
    for i in range(100):
        queue.put(i)
        time.sleep(0.1)
if __name__ == '__main__':
    queue = Queue()
    producer_thread = threading.Thread(target=producer_data)
    producer_thread.start()
    thread_list = []
    for i in range(5):
        thread = threading.Thread(target=task_func)
        thread.start()
        thread_list.append(thread)
    for thread in thread_list:
        thread.join()
    print("主程序執行結束!")

注意:上述寫法:

    while queue.qsize() > 0:
        x = queue.get()

當生產者速度沒有消費者速度快時,上述消費者代碼會提前結束,導致生產者的速度不能消費。

    while True:
        x = queue.get()

這種寫法也存在問題,此時消費者隊列會一直監聽生產者隊列是否有數據,導致線程一直處于阻塞狀態,程序會一直阻塞不會停止,嚴重浪費系統資源。如果使用apscheduler等定時任務的庫的話,會導致定時任務無法啟動。

其實queue隊列中的put()或者get()方法中都提供了timeout參數,利用這個參數可以有效解決上述消除不能消費和線程一直阻塞問題。

示例代碼2:

import time
import threading
from queue import Queue
def task_func():
    global queue
    while True:
        x = queue.get(timeout=10)
        print(f"num: {x}")
def producer_data():
    global queue
    for i in range(100):
        queue.put(i)
        time.sleep(0.1)
if __name__ == '__main__':
    queue = Queue()
    producer_thread = threading.Thread(target=producer_data)
    producer_thread.start()
    thread_list = []
    for i in range(5):
        thread = threading.Thread(target=task_func)
        thread.start()
        thread_list.append(thread)
    for thread in thread_list:
        thread.join()
    print("主程序執行結束!")

運行結果:

Python隊列的使用方法有哪些

根據不同的情境,可以根據實際情況設置timeout的值。如果使用定時任務,使用timeout是可以的,不會使程序拋異常停止的。

2、from multiprocessing import Queue

此模塊用于對進程,但是不能用于進程池

示例代碼:

import time
from multiprocessing import Process, Queue
import queue
def producer(queue):
    queue.put("a")
    time.sleep(2)
def consumer(queue):
    time.sleep(2)
    data = queue.get()
    print(data)
if __name__ == "__main__":
    # queue = queue.Queue()
    queue = Queue()
    my_producer = Process(target=producer, args=(queue, ))
    my_consumer = Process(target=consumer, args=(queue, ))
    my_producer.start()
    my_consumer.start()
    my_producer.join()
    my_consumer.join()
# 使用queue模塊的Queue()會報錯
# 使用multiprocessing中的Queue(),正確輸出a

運行結果:

Python隊列的使用方法有哪些

3、from multiprocessing import Manager

示例代碼:

import time
from multiprocessing import Process, Queue, Pool, Manager
def producer(queue):
    queue.put("a")
    time.sleep(2)
def consumer(queue):
    time.sleep(2)
    data = queue.get()
    print(data)
if __name__ == "__main__":
    # queue = Queue()
    queue = Manager().Queue()
    pool = Pool()
    # pool中的進程間通信需要使用Manager
    pool.apply_async(producer, args=(queue, ))
    pool.apply_async(consumer, args=(queue, ))
    pool.close()
    pool.join()

運行結果:

Python隊列的使用方法有哪些

以上就是“Python隊列的使用方法有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

甘德县| 临江市| 双江| 孟连| 诸暨市| 綦江县| 图片| 宁河县| 涡阳县| 老河口市| 菏泽市| 饶河县| 连城县| 开平市| 黔江区| 柘城县| 乌海市| 札达县| 乌拉特后旗| 鹤山市| 青田县| 婺源县| 克什克腾旗| 泰州市| 太谷县| 临沂市| 忻州市| 营口市| 韩城市| 忻城县| 寿阳县| 兴安县| 屏东市| 梁河县| 广州市| 加查县| 临潭县| 泸州市| 潮州市| 西安市| 织金县|