如何将异步函数传递给 Python 中的线程目标?

Dam*_*leș 12 python multithreading

我有以下代码:

async some_callback(args):
    await some_function()
Run Code Online (Sandbox Code Playgroud)

我需要将它作为目标提供给一个线程:

_thread = threading.Thread(target=some_callback, args=("some text"))
_thread.start()
Run Code Online (Sandbox Code Playgroud)

我得到的错误是“some_callback从未等待”。
任何想法如何解决这个问题?

小智 16

您可以通过在执行异步之间添加函数来实现:

async def some_callback(args):
    await some_function()

def between_callback(args):
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    loop.run_until_complete(some_callback(args))
    loop.close()

_thread = threading.Thread(target=between_callback, args=("some text"))
_thread.start()

Run Code Online (Sandbox Code Playgroud)


mck*_*brd 14

从 Python 3.7 开始,您可以使用asyncio.run()loop.run_until_complete()以下更简单的方法:

_thread = threading.Thread(target=asyncio.run, args=(some_callback("some text"),))
_thread.start()
Run Code Online (Sandbox Code Playgroud)

  • @anton 不确定是否理解这个问题。`some_callback("some_text")` 返回一个协程对象,请参阅[文档](https://docs.python.org/3/library/asyncio-task.html#coroutines):“简单地调用协程不会调度它被执行”和“为了实际运行一个协程,asyncio 提供了三种主要机制”,其中包括 `asyncio.run`。在我的回答中,“asyncio.run”是线程的目标,并以“some_callback”函数返回的协程对象作为参数,因此它在线程中执行 (2认同)
  • 当然,不确定我当时的想法是什么,但三个月前我仍在努力接受异步(甚至比现在还要多!)所以可能正在尝试传递一个正常的函数。不管怎样,抱歉造成噪音! (2认同)
  • 这可能会出现问题,因为协程是在与其运行的循环不同的事件循环中创建的。像[this](/sf/answers/4915816181/)这样的东西虽然更冗长,但可能更好。 (2认同)