亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

新巴尔虎右旗| 临猗县| 海口市| 六安市| 临沭县| 长宁县| 鄯善县| 紫金县| 惠安县| 稷山县| 雷山县| 集贤县| 彭水| 邓州市| 广平县| 海丰县| 商都县| 江津市| 山丹县| 仙游县| 衡南县| 陆良县| 宝鸡市| 新宾| 天津市| 莱阳市| 山东省| 万年县| 竹溪县| 营口市| 广西| 廉江市| 怀化市| 海城市| 博客| 永善县| 金山区| 洪泽县| 遵义市| 龙海市| 紫金县|