Heim  >  Artikel  >  Backend-Entwicklung  >  Welche Möglichkeiten gibt es, Python-Warteschlangen zu verwenden?

Welche Möglichkeiten gibt es, Python-Warteschlangen zu verwenden?

WBOY
WBOYnach vorne
2023-05-12 14:19:191560Durchsuche

In Python werden ungefähr drei Warteschlangenmodule verwendet:

1 aus der Warteschlangenimportwarteschlange

Dieses Modul ist für die Kommunikation zwischen Threads geeignet, kann jedoch nicht verwendet werden für Prozesse Kommunikation zwischen.

Beispielcode 1: [Hinweis: Derzeit liegt ein Fehler im Code vor! ! ! 】

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("主程序执行结束!")

Hinweis: Die obige Schrift:

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

Wenn die Produzentengeschwindigkeit nicht so hoch ist wie die Verbrauchergeschwindigkeit, gilt der obige Verbrauchercode endet vorzeitig, was dazu führt, dass die Geschwindigkeit des Produzenten nicht genutzt werden kann.

    while True:
        x = queue.get()

Bei dieser Schreibweise gibt es auch ein Problem. Zu diesem Zeitpunkt überwacht die Verbraucherwarteschlange immer, ob die Produzentenwarteschlange Daten enthält, was dazu führt, dass der Thread und das Programm ständig blockiert werden wird blockiert und nicht gestoppt, was eine ernsthafte Verschwendung von Systemressourcen darstellt. Wenn Sie eine Bibliothek für geplante Aufgaben wie Apscheduler verwenden, wird die geplante Aufgabe nicht gestartet.

Tatsächlich wird der Timeout-Parameter in der put()- oder get()-Methode in der Warteschlangenwarteschlange bereitgestellt. Durch die Verwendung dieses Parameters können die oben genannten Probleme der Unfähigkeit zum Konsumieren und der Thread-Blockierung effektiv gelöst werden.

Beispielcode 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("主程序执行结束!")

Laufendes Ergebnis:

Welche Möglichkeiten gibt es, Python-Warteschlangen zu verwenden?

Je nach Situation, Sie Sie können den Timeout-Wert entsprechend der tatsächlichen Situation einstellen. Wenn Sie eine geplante Aufgabe verwenden, ist die Verwendung einer Zeitüberschreitung in Ordnung, und das Programm hört nicht auf, eine Ausnahme auszulösen.

2. aus der Multiprocessing-Importwarteschlange

Dieses Modul wird für Prozesse verwendet, kann aber nicht für Prozesspools verwendet werden

Beispielcode: #🎜🎜 #

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

Ergebnis ausführen:

Welche Möglichkeiten gibt es, Python-Warteschlangen zu verwenden?3. vom Multiprocessing-Importmanager

Beispielcode:

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()

Laufergebnis:

Das obige ist der detaillierte Inhalt vonWelche Möglichkeiten gibt es, Python-Warteschlangen zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen