Pythonの生産者/消費者モデル

Pythonの生産者/消費者モデル

生産者/消費者モデルは次の点で機能します
。1。クロール時
2.分散操作:セロリ
本質:生産データと消費データの効率のバランスを取り、効率を最大化することです

なぜ生産者/消費者モデルを使用するのですか?
並行プログラミングでは、プロデューサーの処理速度が速く、コンシューマーの処理速度が比較的遅い場合、プロデューサーは、データの生成を続行する前に、コンシューマーが処理を終了するのを待つ必要があります。同様に、消費者の処理能力が生産者の処理能力よりも大きい場合、消費者は生産者を待たなければなりません。この待機問題を解決するために、プロデューサーとコンシューマーのモデルが導入されました。それらが継続的に生産および消費できるようにします。

このモデルをいつ使用するのですか?
プログラムには2つの明らかなタイプのタスクがあります。1つのタイプのタスクは本番環境を担当し、もう1つのタイプのタスクは本番データ(クローラーなど)の処理を担当します。

このモデルを使用する利点は何ですか?
1.生産者と消費者の分離と統合を実現する

2.生産性と消費力のバランスが取れています。つまり、生産者は継続的に生産しており、消費者は2つが直接通信しているのではなく、キューと通信しているため、消費を継続できます。

from multiprocessing import Queue
from multiprocessing import Process
import time
import random

def consumer(q,name):  # 消费者:通常取到某些数据之后还要进行某些操作
    while True:
        food = q.get()
        if food:
            print("%s吃了%s" % (name, food))
        else:
           break

def producer(q,name,food):  # 生产者:通常在数据之前需要通过某些代码来获取数据
    for i in range(10):
        foodi = "%s%s" % (food,i)
        print("%s生产了%s" % (name,foodi))
        # time.sleep(random.randint(1,3))
        q.put(foodi)
    #q.put(None)


if __name__ == "__main__":
    q = Queue()
    p1 = Process(target=producer,args=(q,'大壮','泪水'))
    c1 = Process(target=consumer,args=(q,'alex'))
    c1.start()
    p1.start()
    p1.join()

大壮生产了泪水0
大壮生产了泪水1
大壮生产了泪水2
大壮生产了泪水3
alex吃了泪水0
alex吃了泪水1
alex吃了泪水2
大壮生产了泪水4
大壮生产了泪水5
alex吃了泪水3
alex吃了泪水4
大壮生产了泪水6
alex吃了泪水5
大壮生产了泪水7
大壮生产了泪水8
大壮生产了泪水9
alex吃了泪水6
alex吃了泪水7
alex吃了泪水8
alex吃了泪水9

現在、生産者は生産を続け、消費者は消費を続けているのは事実です。しかし、現時点では、メインプロセスが終了していないという問題があります。その理由は、プロデューサーp1はプロダクション後に終了しますが、コンシューマーc1はq.get()が空になった後、その場で待機しているためです。この問題を解決するために、プロデューサーはプロダクションの完了後に終了シグナルをキューに送信します。これにより、コンシューマーは終了シグナルを受信した後、無限ループから飛び出すことができます。次のように変更します。

from multiprocessing import Queue
from multiprocessing import Process
import time
import random

def consumer(q,name):  # 消费者:通常取到某些数据之后还要进行某些操作
    while True:
        food = q.get()
        if food:
            print("%s吃了%s" % (name, food))
        else:
           break

def producer(q,name,food):  # 生产者:通常在数据之前需要通过某些代码来获取数据
    for i in range(10):
        foodi = "%s%s" % (food,i)
        print("%s生产了%s" % (name,foodi))
        # time.sleep(random.randint(1,3))
        q.put(foodi)
    q.put(None)  #修改了这里


if __name__ == "__main__":
    q = Queue()
    p1 = Process(target=producer,args=(q,'大壮','泪水'))
    c1 = Process(target=consumer,args=(q,'alex'))
    c1.start()
    p1.start()
    p1.join()

おすすめ

転載: blog.csdn.net/m0_50481455/article/details/113845260
おすすめ