Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah cara untuk menggunakan baris gilir Python?

Apakah cara untuk menggunakan baris gilir Python?

WBOY
WBOYke hadapan
2023-05-12 14:19:191560semak imbas

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

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:

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

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

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam