[PYTHON] Erzielen Sie eine asynchrone http-Kommunikation mit asyncio

Hintergrund

Angenommen, Sie möchten weiterhin Objekte auf einem Edge-Terminal erkennen und die Verarbeitungsergebnisse an den Server senden. Wenn die HTTP-POST-Verarbeitung während der Verarbeitung der Erkennungsschleife eingefügt wird, wird die Verarbeitung angehalten, bis eine Antwort zurückgegeben wird. Die asynchrone Kommunikation kann mithilfe des Python-Standards async / await realisiert werden. Ich werde zusammenfassen, wie man es benutzt.

Referenzseite

Umgebung

Prozessablauf

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

Was ist asynchron?

Erklärung zur Definition von Coroutin. Korrouten sind eine allgemeinere Form von Unterprogrammen, die mehrere Einstiegspunkte haben können. Das heißt, der Prozess kann von diesem Speicherort aus unterbrochen und neu gestartet werden.

Was ist eine Ereignisschleife?

Ein Bild wie ein Taskplaner ist in Ordnung. Durch Registrieren eines Collouts für die Ereignisschleife wird diese automatisch ausgeführt, gestoppt und erneut verarbeitet.

Inhalt der Verarbeitung

  1. Registrieren Sie das Haupt-Collout in der Ereignisschleife bei asyncio.run.
  2. Registrieren Sie innerhalb der Hauptkoroutine unter bestimmten Bedingungen einen weiteren Koroutinentest () in der Ereignisschleife. Der Prozess von test () wird parallel zur Registrierung gestartet.
  3. Warten Sie in test (), bis asyncio.sleep (2) den Vorgang "Warten auf 2 Sekunden" durchführt.
  4. Die Verarbeitung von main () wird nicht gestoppt, sondern definiert die Rückruffunktion, die ausgeführt werden soll, wenn der aktuell registrierte test () = http_req endet.
  5. Die Rückruffunktion zeigt das Ergebnis des zukünftigen Objekts (wie die Entität von http_req) in der Standardausgabe an.
  1. Registrieren Sie den Prozess in der Ereignisschleife und führen Sie ihn aus, auch wenn er sich nicht unter bestimmten Bedingungen befindet. Dann wird die while-Schleife fortgesetzt.

Vorsichtsmaßnahmen für die Montage

http-Anfragen verwendeten nicht die Anforderungsbibliothek, sondern eine Bibliothek namens aiohttp.

$ pip install aiohttp

HTTP-Anforderungen können in der folgenden Form als Collouts registriert werden.

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

Erzielen Sie eine asynchrone http-Kommunikation mit asyncio
Erzielen Sie eine asynchrone http-Kommunikation mit asyncio
Ich habe versucht, asynchrone Verarbeitung mit Asyncio
WiringPi-SPI-Kommunikation mit Python
HTTP-Kommunikation mit Python
TCP-Kommunikation mit Socket-Modul-Python3
Ich habe versucht, mit dem Server-Client über tmux zu kommunizieren