Cómo ejecutar dos funciones asíncronas para siempre – Python

La programación asíncrona es un tipo de programación en la que podemos ejecutar más de una tarea sin bloquear la tarea principal (función). En Python, hay muchas formas de ejecutar más de una función al mismo tiempo, una de las formas es usando asyncio . La programación asincrónica le permite escribir código simultáneo que se ejecuta en un único subproceso.

Nota: Asyncio no usa subprocesos ni multiprocesamiento para hacer que el programa sea asíncrono.

Coroutine : Coroutines es una estructura de control general mediante la cual el control de flujo se pasa cooperativamente entre dos rutinas diferentes sin retorno. En asyncio Coroutine se puede crear usando la palabra clave async antes de def.                    

async def speak_async():
   for i in range(100):
       print("Hello I'm Abhishek, writer on GFG")

Si intenta ejecutar una función asíncrona directamente, recibirá una advertencia de tiempo de ejecución:

RuntimeWarning: nunca se esperó la rutina ‘speak_async’

hablar_async()

Para ejecutar una función asíncrona (corrutina), debe llamarla mediante un bucle de eventos.

Bucles de eventos: puede pensar en los bucles de eventos como funciones para ejecutar tareas asincrónicas y devoluciones de llamada, realizar operaciones de E/S de red y ejecutar subprocesos. 

Ejemplo 1: Ejemplo de bucle de eventos para ejecutar una función asíncrona para ejecutar una única función asíncrona:

Python3

import asyncio
  
  
async def function_asyc():
    for i in range(5):
        print("Hello, I'm Abhishek")
        print("GFG is Great")
    return 0
  
# to run the above function we'll 
# use Event Loops these are low 
# level functions to run async functions
loop = asyncio.get_event_loop()
loop.run_until_complete(function_asyc())
loop.close()
print("HELLO WORLD")
print("HELLO WORLD")
  
# You can also use High Level functions Like:
# asyncio.run(function_asyc())
Producción

Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great
HELLO WORLD
HELLO WORLD

Ejemplo 2: Ejecutar más de una función a la vez. Para hacerlo, debemos crear una nueva función asíncrona (principal) y llamar a todas las funciones asíncronas (que queremos ejecutar al mismo tiempo) en esa nueva función (principal). Y luego llame a la nueva función (principal) usando Event Loops…

Código:

Python3

import asyncio
  
  
async def function_asyc():
    for i in range(100000):
        if i % 50000 == 0:
            print("Hello, I'm Abhishek")
            print("GFG is Great")
    return 0
  
async def function_2():
    print("\n HELLO WORLD \n")
    return 0
  
async def main():
    f1 = loop.create_task(function_asyc())
    f2 = loop.create_task(function_2())
    await asyncio.wait([f1, f2])
  
# to run the above function we'll 
# use Event Loops these are low 
# level functions to run async functions
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
  
# You can also use High Level functions Like:
# asyncio.run(function_asyc())
Producción

Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great

 HELLO WORLD 

Nota: .create_task() se usa para ejecutar varias funciones asíncronas a la vez.

Ejemplo 3: aquí puede ver que function_async() y function_2() no se ejecutan simultáneamente, la salida de function_async() se muestra primero y luego se muestra la salida de function_2(), eso significa que function_2() se ejecuta después de la ejecución de function_async().

¡Pero no queremos eso! queremos que ambas funciones progresen al mismo tiempo, por lo que para lograrlo en python tenemos que decirle explícitamente a la computadora cuándo cambiar de una función a otra.

Código:

Python3

import asyncio
  
  
async def function_asyc():
    
    for i in range(100000):
        if i % 50000 == 0:
            print("Hello, I'm Abhishek")
            print("GFG is Great")
              
            # New Line Added
            await asyncio.sleep(0.01)
    return 0
  
async def function_2():
    print("\n HELLO WORLD \n")
    return 0
  
async def main():
    f1 = loop.create_task(function_asyc())
    f2 = loop.create_task(function_2())
    await asyncio.wait([f1, f2])
  
# to run the above function we'll 
# use Event Loops these are low level
# functions to run async functions
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
  
# You can also use High Level functions Like:
# asyncio.run(function_asyc())
Producción

Hello, I'm Abhishek
GFG is Great

 HELLO WORLD 

Hello, I'm Abhishek
GFG is Great

Ahora, como puede ver, la segunda función se ejecuta durante la ejecución de la función en ejecución (function_async()). Entonces, estos fueron los conceptos básicos, ahora veamos cómo ejecutar dos funciones asíncronas para siempre.

Ejecutando dos funciones asíncronas para siempre Python:

Método 1: simplemente use el ciclo while True en la función principal:

Python3

import asyncio
  
  
async def function_asyc():
    i = 0
    while i < 1000000:
        i += 1
        if i % 50000 == 0:
            print("Hello, I'm Abhishek")
            print("GFG is Great")
            await asyncio.sleep(0.01)
  
async def function_2():
    print("\n HELLO WORLD \n")
  
  
async def main():
    
    # New Line Added
    while True:
        f1 = loop.create_task(function_asyc())
        f2 = loop.create_task(function_2())
        await asyncio.wait([f1, f2])
  
# to run the above function we'll 
# use Event Loops these are low
# level functions to run async functions
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

Producción:

Hello, I'm Abhishek
GFG is Great

 HELLO WORLD 

Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great
.
.
.
.

Método 2: Usar bucles while True para ambas funciones y llamarlas usando asyncio.ensure_future() y loop.run_forever() 

Nota: sure_future nos permite ejecutar una rutina en segundo plano, sin esperar explícitamente a que finalice.

Python3

import asyncio
  
  
async def function_asyc():
    i = 0
      
    while True:
        i += 1
        if i % 50000 == 0:
            print("Hello, I'm Abhishek")
            print("GFG is Great")
            await asyncio.sleep(0.01)
  
async def function_2():
    while True:
        await asyncio.sleep(0.01)
        print("\n HELLO WORLD \n")
  
loop = asyncio.get_event_loop()
asyncio.ensure_future(function_asyc())
asyncio.ensure_future(function_2())
loop.run_forever()

Producción:

Hello, I'm Abhishek
GFG is Great
Hello, I'm Abhishek
GFG is Great

 HELLO WORLD 

Hello, I'm Abhishek
GFG is Great
.
.
.

Publicación traducida automáticamente

Artículo escrito por abhishekmule y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *