如何在 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)
我有异步程序,需要 运行 一个不阻塞事件循环的阻塞函数。执行此函数需要大约 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)