Heim >Backend-Entwicklung >Python-Tutorial >Welche Möglichkeiten gibt es, Python-Warteschlangen zu verwenden?
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:
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.
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(),正确输出aErgebnis ausführen:
3. vom Multiprocessing-Importmanager
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!