Productor y consumidor de colas modelo

Productor y consumidor de colas modelo

Una cola de la cola de módulo

  • Para IPC: la comunicación entre procesos, así como tener el módulo Administrador misma función
    • La comunicación entre procesos se puede utilizar en una tubería de cola y tubería
    • Cola se basa zócalo, pepinillo y cerraduras de lograr, debido a que el bloqueo se logra basa en la cola de transmisión de datos debe ser seguro, pero la pérdida de eficacia de la transmisión será.
    • Basado socket tubería y salmuera lograr, pero no bloqueado, por lo que la alta eficiencia de transmisión de la tubería, los datos no es segura.
  • cola de multi-proceso es diferente de la cola ordinaria
  • 导入: de multiprocesamiento importación de colas
  • Ejemplos de objetos: q = Queue ()
  • A la cola de datos de entrada: q.put (tipos de datos)
  • Extraer datos de la cola: q.get (datos almacenada)

    De particular interés son: datos de la cola se pueden tomar solamente una vez desde el interior, no puede tomar una segunda, si todavía tienen que tomar los datos, los datos deben ser almacenados de nuevo, el uso Poen similar y el uso de este módulo de subproceso, aunque sólo sea para poner un dato, pero tomando dos veces, primero en llevar el programa en una tarjeta de datos en ese país, no ha terminado.

  • Datos de la cola sigue el principio FIFO, mientras que la pila es seguir el principio de último en salir.

from multiprocessing import Queue,Process
import os


def son(q):
    q.put('你好')
    # 往队列中添加消息:put,第一次存入数据
    print(q.get())
    # 从队列中获取消息:get()

def pro(q):
    print(q.get())
    # 接收第二个数据

if __name__ == '__main__':

    q = Queue()
    p = Process(target=son, args=(q,))
    p.start()
    p1 = Process(target=pro, args=(q,))
    p1.start()
    print(q.get())
    # 接收第一个数据
    q.put('hello')
    q.put('第二个你好')
    # 第二次存入数据

'''
结果是:
你好
hello
第二个你好

'''

En segundo lugar, el modelo productor-consumidor

  • Conceptos básicos:
    • Productor y modelo de consumo el original completo fuertemente acoplado de procesamiento de datos se divide en una pluralidad de datos débilmente acoplados sección de procesamiento, para facilitar la planificación de las modificaciones a las diferentes partes del productor y los datos de consumo eficiencia de procesamiento de acuerdo con la producción y el consumo de número, para lograr la máxima eficiencia y el equilibrio.
    • Fabricante: adquisición de códigos de datos en primer lugar, y el proceso de procesamiento de datos, el procesamiento se haya completado los datos almacenados en la cola
    • De consumo: productores obtuvieron los datos después del procesamiento de la cola, sino también para llevar a cabo ciertas operaciones
    • Cola: cola de la cola es un intercambio de datos entre los consumidores y los productores necesitan utilizar una comunicación multi-proceso.
  • escenarios de aplicación:
    • Con el tiempo, los reptiles para la adquisición y procesamiento de páginas web es necesario utilizar el modelo
    • Serán utilizados en un operativo distribuido en el apio, apio es en realidad dos grandes productores y noticias por modelo
  • La esencia del modelo es:
    dejar que la eficiencia de los datos de producción y los datos de consumo puede lograr el equilibrio y maximizar la eficiencia.
from multiprocessing import Queue, Process
import time
import random

def consumer(q):
    for i in range(12):
        print(q.get(i))



def producer(q):
    for i in range(12):
        q.put(i)
        time.sleep(random.randint(1,3))



if __name__ == '__main__':
    q = Queue()
    c1 = Process(target=consumer, args=(q,))
    p1 = Process(target=producer, args=(q,))

    p1.start()
    c1.start()
  • Surgen problemas y soluciones:
    • Cuando un número igual de productores y consumidores, los productores son propensos a acelerar la producción de gasto de los consumidores no seguir el ritmo, cada uno produciendo una mercancía, los consumidores consumen rápidamente.
    '''版本一:生产者和消费者都是一个,或者数量一样,每生产一个,消费者快速的吃掉,这个会出现生产慢,消费快,
    供不应求的情况
    '''
    from multiprocessing import Process, Queue
    import time
    import random
    
    
    def producer(q, name):
        for i in range(1,11):
            food = 'food%s' % i
            q.put(food)
            print('%s生产了商品%s' % (name, food))
            time.sleep(1)
    
    
    
    def consumer(q, name):
        for i in range(1, 11):
            food = q.get()
            print('%s消费了商品%s' % (name, food))
            time.sleep(1)
    
    
    if __name__ == '__main__':
        q = Queue()
        c1 = Process(target=consumer, args=(q,'小明'))
        p1 = Process(target=producer, args=(q,'刘洋'))
        p1.start()
        c1.start()
    
    • Con el fin de resolver el caso de la oferta a corto superior directamente a abrir un proceso productor, el volumen de producción se duplicará este momento, pero los consumidores sólo puede consumir la mitad de la situación de exceso de oferta, si el aumento de la demanda de los consumidores y la sobreoferta seguirá ciclo caso.
    '''版本二:为解决版本一的问题,版本二中添加一个生产者,扩大供应'''
    from multiprocessing import Process, Queue
    import time
    import random
    
    
    def producer1(q, name):
        for i in range(1,11):
            food = 'food%s' % i
            q.put(food)
            print('%s生产了商品%s' % (name, food))
            time.sleep(1)
    
    def produce2(q, name):
        for i in range(1,11):
            food = 'food%s' % i
            q.put(food)
            print('%s生产了商品%s' % (name, food))
            time.sleep(1)
    
    
    
    def consumer(q, name):
        for i in range(1, 11):
            food = q.get()
            print('%s消费了商品%s' % (name, food))
            time.sleep(1)
    
    
    
    if __name__ == '__main__':
        q = Queue()
        c1 = Process(target=consumer, args=(q,'小明'))
        p1 = Process(target=producer1, args=(q,'刘洋'))
        p2 = Process(target=produce2, args=(q, '玲玲'))
        p1.start()
        p2.start()
        c1.start()
    
    • En respuesta a estas dos versiones de la pregunta, tenemos que modelar el consumidor se establece en un bucle infinito, detener el gasto, los productores establecer el número de modelos de producción, y luego completar la transferencia de la producción a una Ninguno cola cuando los consumidores obtienen en Ninguno cuando está fuera del bucle, tenga en cuenta que debe establecer la sincronización asíncrona, que los productores deberán aportar terminado de esta manera, no hay una longitud de la cola de la consulta.
    '''版本三:解决上述两个版本的问题:不设定消费者消费的数量,只设定生产者生产的数量'''
    
    from multiprocessing import Process, Queue
    import time
    import random
    
    
    def producer1(q, name):
        for i in range(1,11):
            food = 'food%s' % i
            q.put(food)
            print('%s生产了商品%s' % (name, food))
            time.sleep(1)
    
    def produce2(q, name):
        for i in range(1,11):
            food = 'food%s' % i
            q.put(food)
            print('%s生产了商品%s' % (name, food))
            time.sleep(1)
    
    
    
    def consumer(q, name):
        while True:
            food = q.get()
            # 注意:q.get()一个数据只能取一次,q.get()不能直接用于判断条件,需要赋值给变量
            if food:
                # 存在消费
                print('%s消费了商品%s' % (name, food))
                time.sleep(1)
            else:
                # 如果不存在直接跳出循环
                break
    
    if __name__ == '__main__':
        q = Queue()
        c1 = Process(target=consumer, args=(q,'小明'))
        p1 = Process(target=producer1, args=(q,'刘洋'))
        p2 = Process(target=produce2, args=(q, '玲玲'))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
        # 添加join()让两个生产者生产完成
        q.put(None)
        # 再向队列最后再添加一个None,因为队列遵循先进先出的原则,所以最后一个获取的是None
        c1.start()
    

    Extrañas: el demonio, el proceso principal, sub-proceso, el daemon debe preceder a los extremos principales de proceso, el proceso principal debe finalmente terminará.

Supongo que te gusta

Origin www.cnblogs.com/ddzc/p/12448652.html
Recomendado
Clasificación