Как запустить метод с блокирующим поведением в Python asyncio? Метод из библиотеки тессеракта для распознавания - PullRequest
0 голосов
/ 19 июня 2019

У меня есть асинхронная программа, и необходимо запустить функцию блокировки, не блокируя цикл событий.Выполнение этой функции занимает около 4 секунд.К сожалению, я не могу позволить этому блокировать цикл обработки событий в течение такого длительного времени.

Код ниже говорит о том, что я хочу сделать.

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

Однако я получаю ошибку:

TypeError: 'str' object is not callable

Не могли бы вы сказать мне, что не так с этим кодом и как я могу получить желаемое поведение?

1 Ответ

0 голосов
/ 19 июня 2019

Вы почти правильно поняли.Проблема в том, что run_in_executor является функцией, аналогичной любой другой, поэтому, если вы передадите ее image_to_string(image), Python интерпретирует это как инструкцию для , немедленно вызовет image_to_string ипередать результат вызова run_in_executor.

Чтобы избежать этой интерпретации, run_in_executor принимает функцию , которую он будет вызывать самостоятельно, вдругая нить.За функцией необязательно следуют аргументы, поэтому правильный вызов выглядит следующим образом:

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