2017-07-01 4 views
0

Ist es möglich, einen Thread ausführen Methode async, so dass es Coroutinen in ihm ausführen kann? Mir ist klar, dass ich Paradigmen mische - ich versuche eine 3rd-Party-Bibliothek zu integrieren, die Coroutinen verwendet, während mein Projekt Threads verwendet. Bevor ich in Erwägung ziehe, mein Projekt so zu aktualisieren, dass ich stattdessen Coroutines verwende, möchte ich die Ausführung von Coroutinen in meinen Threads untersuchen.Aufruf Coroutine in Thread

Unten ist mein Beispiel Usecase, wo ich einen Thread habe, aber ich möchte eine Coroutine aus meinem Thread aufrufen. Mein Problem ist die Funktion MyThread::run() scheint nicht ausgeführt werden (Drucken). Ist das, was ich versuche, möglich ... und ratsam?

Antwort

0

Sie müssen eine asyncio Ereignisschleife erstellen und warten, bis die Coroutine abgeschlossen ist.

import asyncio 
from threading import Thread 


class MyThread(Thread): 
    def run(self): 
     loop = asyncio.new_event_loop() 
     loop.run_until_complete(self._run()) 
     loop.close() 

    async def _run(self): 
     while True: 
      print("MyThread::run() sync") 
      await asyncio.sleep(1) 
      # OR 
      # volume = await market_place.get_24h_volume() 


t = MyThread() 
t.start() 
try: 
    t.join() 
except KeyboardInterrupt: 
    pass 
+0

danke für deine antwort. Wenn ich den Code ausführe, wird keine Druckausgabe angezeigt. Wenn ich jedoch 'asbest ascio.sleep (1)' auskommentiere, wird die Druckausgabe 'MyThread :: run() sync' oft angezeigt, so dass der Thread läuft. Kannst du erklären, was los ist? Warum sollte es nicht mit dem Code 'awarte asyncio.sleep (1)' gedruckt werden? –

+0

@JakeM Es druckt 'MyThread :: run() sync' für mich mit ..sleep .. Welche Version von Python benutzen Sie? Ich habe mit 3.6.1 getestet. – falsetru

Verwandte Themen