El modelo productor-consumidor de Python

El modelo productor-consumidor de Python

El modelo productor-consumidor funciona en:
1. Al rastrear
2. Operación distribuida:
la esencia del apio : es equilibrar la eficiencia de los datos de producción y los datos de consumo y maximizar la eficiencia

¿Por qué utilizar el modelo productor-consumidor?
En la programación concurrente, si la velocidad de procesamiento del productor es rápida y la velocidad de procesamiento del consumidor es relativamente lenta, entonces el productor debe esperar a que el consumidor termine de procesar antes de que pueda continuar produciendo datos. De la misma manera, si el poder de procesamiento del consumidor es mayor que el del productor, entonces el consumidor debe esperar al productor. Para solucionar este problema de espera, se introdujo el modelo de productor y consumidor. Permítales producir y consumir continuamente.

¿Cuándo usar este modelo?
Hay dos tipos obvios de tareas en el programa, un tipo de tarea es responsable de la producción y el otro tipo de tarea es responsable de procesar los datos de producción (como los rastreadores).

¿Cuáles son los beneficios de utilizar este modelo?
1. Realizar el desacoplamiento y la integración de productores y consumidores

2. Equilibra la productividad y el poder de consumo, es decir, los productores han estado produciendo continuamente y los consumidores pueden seguir consumiendo, porque los dos ya no se comunican directamente, sino que se comunican con la cola.

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

Ahora bien, es cierto que los productores siguen produciendo y los consumidores siguen consumiendo. Pero existe el problema en este momento de que el proceso principal no ha terminado. La razón es: el productor p1 termina después de la producción, pero el consumidor c1, después de que q.get () está vacío, ha estado esperando en su lugar. Para resolver este problema, el productor enviará una señal de finalización a la cola después de que se complete la producción, de modo que el consumidor pueda saltar del bucle infinito después de recibir la señal de finalización. Modifique de la siguiente manera:

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

Supongo que te gusta

Origin blog.csdn.net/m0_50481455/article/details/113845260
Recomendado
Clasificación