在Thread中调用coroutine

时间:2017-07-01 00:09:34

标签: python python-3.x

是否可以使线程运行方法异步,以便它可以在其中执行协同程序?我意识到我正在混合范式 - 我正在尝试集成使用协同程序的第三方库,而我的项目使用线程。在我考虑更新我的项目以使用协同程序之前,我想在我的线程中探索执行协同程序。

下面是我的示例用例,我有一个线程,但我想从我的线程中调用一个协同程序。我的问题是函数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

1 个答案:

答案 0 :(得分:1)

您需要创建一个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