目次
Python では大きく 3 つのキュー モジュールが使用されます:
1. from queue import Queue
2. from multiprocessing import Queue
3. マルチプロセスインポートマネージャーから
ホームページ バックエンド開発 Python チュートリアル Python キューの使用方法にはどのようなものがありますか?

Python キューの使用方法にはどのようなものがありますか?

May 12, 2023 pm 02:19 PM
python

Python では大きく 3 つのキュー モジュールが使用されます:

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 などのスケジュールされたタスク ライブラリを使用する場合、スケジュールされたタスクは開始されません。

実際には、タイムアウト パラメータはキュー キューの put() または get() メソッドで提供されており、このパラメータを使用すると、前述の消費不能およびスレッド ブロックの問題を効果的に解決できます。

サンプルコード 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 キューの使用方法にはどのようなものがありますか?

さまざまな状況に応じて、タイムアウトの値を設定できます。実際の状況。スケジュールされたタスクを使用する場合は、タイムアウトを使用しても問題ありません。プログラムは例外のスローを停止しません。

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. マルチプロセスインポートマネージャーから

サンプルコード:

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 キューの使用方法にはどのようなものがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Deepseek Xiaomiをダウンロードする方法 Deepseek Xiaomiをダウンロードする方法 Feb 19, 2025 pm 05:27 PM

Deepseek Xiaomiをダウンロードする方法

テンプレートのメリットとデメリットは何ですか? テンプレートのメリットとデメリットは何ですか? May 08, 2024 pm 03:51 PM

テンプレートのメリットとデメリットは何ですか?

Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表 Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表 Jul 01, 2024 am 07:22 AM

Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表

わずか 250 ドルで、Hugging Face のテクニカル ディレクターが Llama 3 を段階的に微調整する方法を教えます わずか 250 ドルで、Hugging Face のテクニカル ディレクターが Llama 3 を段階的に微調整する方法を教えます May 06, 2024 pm 03:52 PM

わずか 250 ドルで、Hugging Face のテクニカル ディレクターが Llama 3 を段階的に微調整する方法を教えます

いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する May 06, 2024 pm 04:43 PM

いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する

golang 関数のデバッグと分析の完全ガイド golang 関数のデバッグと分析の完全ガイド May 06, 2024 pm 02:00 PM

golang 関数のデバッグと分析の完全ガイド

どうやって彼にdeepseekに尋ねますか どうやって彼にdeepseekに尋ねますか Feb 19, 2025 pm 04:42 PM

どうやって彼にdeepseekに尋ねますか

NET40とはどのようなソフトウェアですか? NET40とはどのようなソフトウェアですか? May 10, 2024 am 01:12 AM

NET40とはどのようなソフトウェアですか?

See all articles