Apakah cara untuk menggunakan baris gilir Python?

WBOY
Lepaskan: 2023-05-12 14:19:19
ke hadapan
1565 orang telah melayarinya

Terdapat kira-kira tiga modul baris gilir yang digunakan dalam ular sawa:

1 daripada baris gilir import Queue

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

Nota: Tulisan di atas:

    while queue.qsize() > 0:
        x = queue.get()
Salin selepas log masuk

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()
Salin selepas log masuk

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

Hasil berjalan:

Apakah cara untuk menggunakan baris gilir Python?

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.

2. daripada berbilang pemprosesan import Queue

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
Salin selepas log masuk

Hasil berjalan :

Apakah cara untuk menggunakan baris gilir Python?

3 daripada Pengurus import berbilang pemprosesan

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()
Salin selepas log masuk

Hasil jalankan:

Apakah cara untuk menggunakan baris gilir Python?

Atas ialah kandungan terperinci Apakah cara untuk menggunakan baris gilir Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan