2017-07-01 66 views
0

是否有可能使線程運行方法異步,因此它可以在其內部執行協程?我意識到我是混合範例 - 我試圖集成使用協同程序的第三方庫,而我的項目使用線程。在考慮更新我的項目來使用協程,而不是我想探索在我的線程中執行協程。線程內調用協程

下面是我的示例用例,我有一個線程,但我想從我的線程中調用一個協程。我的問題是功能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