2017-07-01 22 views
0

スレッド実行メソッドasyncをコルーチンを内部で実行できるようにすることはできますか?私はパラダイムを混在させていることを認識しています。私はプロジェクトでスレッドを使用しているのに対し、コルーチンを使用するサードパーティのライブラリを統合しようとしています。代わりにコルーチンを使用するようにプロジェクトを更新する前に、スレッド内でコルーチンを実行する方法を調べたいと思います。スレッド内でコルーチンを呼び出す

私はスレッドを持っていますが、私のスレッド内からコルーチンを呼びたい私の例usecaseです。私の問題は、関数MyThread::run()は実行されていないようです(印刷中)。私は可能なことをしようとしています...そしてお勧めですか?

from threading import Thread 

class MyThread(Thread): 

    def __init__(self): 
     Thread.__init__(self) 

     self.start() 

    # def run(self): 
    # while True: 
    #  print("MyThread::run() sync") 

    async def run(self): 
     while True: 
      # This line isn't executing/printing 
      print("MyThread::run() sync") 

      # Call coroutine... 
      # volume = await market_place.get_24h_volume() 


try: 
    t = MyThread() 

    while True: 
     pass 
except KeyboardInterrupt: 
    pass 

答えて

0

asyncioイベントループを作成し、コルーチンが完了するまで待つ必要があります。

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

ご回答ありがとうございます。コードを実行すると、印刷出力は表示されません。しかし、 'await asyncio.sleep(1)'をコメントアウトすると、印刷出力 'MyThread :: run()sync'が何度も表示され、スレッドが実行されます。あなたは何が起こっているのか説明できますか?なぜ、 'await asyncio.sleep(1)'というコードでは印刷されないのですか? –

+0

@ JakeMそれは..sleepと私のために 'MyThread :: run()sync'をプリントします。どのバージョンのPythonを使用していますか?私は3.6.1でテストしました。 – falsetru

関連する問題