Corutina de Python

producir

Ya que queremos hablar de corrutinas, primero debemos mencionar el uso de rendimiento Hay dos usos principales de rendimiento. rendimiento r y n = rendimiento r ,

Una breve comprensión de rendimiento: rendimiento significa que retorno devuelve un valor y recuerda la posición de este retorno, la siguiente iteración comenzará desde esta posición.

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:", res)


g = foo()
print(next(g))
print("-" * 20)
print(next(g))
starting...
4
--------------------
res: None
4

n = rendimiento r 和 r = c. enviar (n)

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:", res)


g = foo()
print(next(g))
print("-" * 20)
# print(next(g))
print(g.send(7))
starting...
4
--------------------
res: 7
4

No es difícil de entender a través del ejemplo anterior, next (g) y g.send (param) son en realidad relativamente similares, pero el último pasa los parámetros en el siguiente paso, o también puede pensar que next (g) es también Se pasan los parámetros, pero se pasa Ninguno.

Entonces, esto también puede explicar por qué next (g) también se puede reemplazar con g.send (None).

Si tienes alguna duda, puedes echarle un vistazo a este blog: https://blog.csdn.net/mieleizhi0522/article/details/82142856/ , creo que después de leer este blog, puedes mirar el código en el siguiente ejemplo. Está luchando.

Coroutine

La mayor ventaja de la corrutina es su eficiencia de ejecución extremadamente alta. Debido a que la conmutación de subrutinas no es conmutación de subprocesos, está controlada por el programa mismo . Por lo tanto, no hay una sobrecarga de conmutación de subprocesos. En comparación con el subproceso múltiple, cuanto más subprocesos, más obvia es la ventaja de rendimiento de las corrutinas.

La segunda gran ventaja es que no hay necesidad de un mecanismo de bloqueo de subprocesos múltiples, porque solo hay un subproceso y no hay conflicto de escritura de variables al mismo tiempo. En la corrutina, los recursos compartidos se controlan sin bloquear, y solo se juzga el estado, por lo que la eficiencia de ejecución es mucho mayor El hilo es mucho mayor.

En términos generales, cuando hablo de corrutinas, me gusta usar el siguiente ejemplo clásico de consumidor productor: resultado de ejecución:

[PRODUCER] Producing 1...
[CONSUMER] Consuming 1...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 200 OK
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 200 OK

Proceso de operación:

Tenga en cuenta que la consumerfunción es una generator, después de consumerpasar produceuna:

  1. Primero llame al c.send(None)generador de puesta en marcha (también es posible la puesta en marcha de la utilidad siguiente (c));

  2. Luego, una vez que se produce algo, c.send(n)cambie a consumerejecución por;

  3. consumerPor yieldllegar el mensaje, procesarla, y pasando yieldel resultado de nuevo;

  4. produceObtenga el consumerresultado procesado y continúe produciendo el siguiente mensaje;

  5. produceSe decidió no producir y todo el proceso terminó con el c.close()cierre consumer.

Todo el proceso está libre de bloqueos, es ejecutado por un subproceso producey consumercooperado para completar la tarea, por lo que se llama "corrutina", en lugar de multitarea preventiva de subprocesos.

Supongo que te gusta

Origin blog.csdn.net/TomorrowAndTuture/article/details/115266112
Recomendado
Clasificación