[PYTHON] Réalisez une communication http asynchrone en utilisant asyncio

Contexte

Par exemple, supposons que vous souhaitiez continuer à détecter des objets sur un terminal périphérique et envoyer les résultats du traitement au serveur. Si le traitement HTTP POST est inséré pendant le traitement de la boucle de détection, le traitement s'arrêtera jusqu'à ce qu'une réponse soit renvoyée. La communication asynchrone peut être réalisée en utilisant le standard python async / await. Je vais résumer comment l'utiliser.

Site de référence

environnement

Flux de processus

import asyncio
import aiohttp

def say_something(future):    # 5
    print(future.result())
    return 'hello!'


async def nested(counter):
    return counter


async def test():
    await asyncio.sleep(2)    # 3
    return'aaaaaaaaaaaaaaaaaaaa'


async def main():
    rep = 0
    counter = 0
    while True:

        if (counter % 100 == 0) and (counter != 0):
            http_req = asyncio.create_task(test())    # 2
            http_req.add_done_callback(say_something)    # 4
            counter = 0
            print(f'rep: {rep}')
            rep += 1

        task = asyncio.create_task(nested(counter))

        print(await task)

        counter += 1


asyncio.run(main())    # 1

Qu'est-ce que l'async

Déclaration pour définir la coroutine. Les corroutes sont une forme plus générale de sous-programmes qui peuvent avoir plusieurs points d'entrée. Autrement dit, le processus peut être interrompu et redémarré à partir de cet emplacement.

Qu'est-ce qu'une boucle d'événements?

Une image comme un planificateur de tâches est très bien. En enregistrant un collout pour la boucle d'événement, il s'exécute, s'arrête et traite à nouveau automatiquement.

Contenu du traitement

  1. Enregistrez le collout principal dans la boucle d'événements avec asyncio.run.
  2. Dans la coroutine principale, enregistrez un autre test de coroutine () dans la boucle d'événements dans des conditions spécifiques. Le processus de test () est lancé en parallèle en même temps que l'enregistrement.
  3. À l'intérieur de test (), await asyncio.sleep (2) effectue le processus "d'attente de 2 secondes".
  4. Le traitement de main () ne s'arrête pas, mais définit la fonction de rappel à exécuter lorsque le test () = http_req actuellement enregistré se termine.
  5. La fonction de rappel affiche le résultat du futur objet (comme l'entité de http_req) dans la sortie standard.
  1. Enregistrez le processus dans la boucle d'événements et exécutez-le même s'il ne l'est pas dans des conditions spécifiques. Ensuite, la boucle while continue.

Précautions de montage

Les requêtes http n'utilisaient pas la bibliothèque de requêtes, mais utilisaient une bibliothèque appelée aiohttp.

$ pip install aiohttp

Les requêtes HTTP peuvent être enregistrées en tant que collouts sous la forme suivante.

async def process_http_request(data):
    async with aiohttp.ClientSession() as session:
        async with session.post(URL, json=data) as response:
            return await response.text()

Recommended Posts

Réalisez une communication http asynchrone en utilisant asyncio
Réalisez une communication http asynchrone en utilisant asyncio
J'ai essayé le traitement asynchrone en utilisant asyncio
Câblage Communication Pi-SPI avec Python
Communication HTTP avec Python
Communication TCP à l'aide du module Socket-Python3
J'ai essayé de communiquer avec le client serveur en utilisant tmux