如何在 Python asyncio 中 运行 具有阻塞行为的方法?方法来自用于 OCR 的 tesseract 库

How to run a method with blocking behaviour in Python asyncio? Method is from tesseract library for OCR

我有异步程序,需要 运行 一个不阻塞事件循环的阻塞函数。执行此函数需要大约 4 秒。不幸的是,我不能让它阻塞事件循环这么长时间。

下面的代码说明了我想做什么。

image = Image.open(image_path)                                   
result = await loop.run_in_executor(None, image_to_string(image ))

但是我收到错误:

TypeError: 'str' object is not callable

你能告诉我这段代码有什么问题吗?我怎样才能得到想要的行为?

你几乎做对了。问题是 run_in_executor 和其他函数一样,所以如果你传递它 image_to_string(image),Python 会将其解释为 call 的指令立即image_to_string,并将调用的结果传递给run_in_executor

为了避免这种解释,run_in_executor 接受一个 函数,它将在另一个线程中自行调用。该函数后面可以选择性地跟参数,因此正确的调用如下所示:

result = await loop.run_in_executor(None, image_to_string, image)