Modul ini sesuai untuk komunikasi antara benang, tetapi tidak boleh digunakan untuk komunikasi antara proses. .
Kod contoh 1: [Nota: Terdapat ralat dalam kod pada masa ini! ! ! 】
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("主程序执行结束!")
Nota: Tulisan di atas:
while queue.qsize() > 0: x = queue.get()
Apabila kelajuan pengeluar tidak sepantas kelajuan pengguna, kod pengguna di atas akan tamat awal, menyebabkan kelajuan pengeluar Tidak boleh dimakan.
while True: x = queue.get()
Terdapat juga masalah dengan cara penulisan ini, pada masa ini, baris gilir pengguna akan sentiasa memantau sama ada baris gilir pengeluar mempunyai data, menyebabkan urutan itu disekat sepanjang masa, dan program akan menjadi. disekat dan tidak akan berhenti, yang secara serius membazir sumber sistem. Jika anda menggunakan pustaka tugas berjadual seperti apscheduler, tugas berjadual tidak akan dimulakan.
Malah, parameter tamat masa disediakan dalam kaedah put() atau get() dalam baris gilir Menggunakan parameter ini boleh menyelesaikan masalah ketidakupayaan yang dinyatakan di atas dan penyekatan benang dengan berkesan.
Kod sampel 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("主程序执行结束!")
Hasil berjalan:
Mengikut situasi yang berbeza, nilai tamat masa boleh ditetapkan mengikut keadaan sebenar. Jika anda menggunakan tugas berjadual, anda boleh menggunakan tamat masa dan program tidak akan berhenti membuang pengecualian.
Modul ini digunakan untuk proses, tetapi tidak boleh digunakan untuk kumpulan proses
Kod sampel:
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
Hasil berjalan :
Kod contoh:
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()
Hasil jalankan:
Atas ialah kandungan terperinci Apakah cara untuk menggunakan baris gilir Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!