Разница между IOLoop.current (). Run_in_executor () и ThreadPoolExecutor (). Submit () - PullRequest
0 голосов
/ 16 октября 2019

Я довольно новичок в Python Tornado и пытаюсь запустить новый поток для выполнения некоторого кода блокировки ввода-вывода, одновременно позволяя серверу продолжать обрабатывать новые запросы. Я немного читал, но все еще не могу понять, в чем разница между этими двумя функциями?

Например, вызывая такой метод:

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(1) as executor:
    future = executor.submit(report.write_gresb_workbook)
    print(future.result())

по сравнению с:

from concurrent.futures import ThreadPoolExecutor
from tornado import ioloop

with ThreadPoolExecutor(1) as executor:
    my_success = await ioloop.IOLoop.current().run_in_executor(executor, report.write_gresb_workbook)
    print(my_success)

write_gresb_workbook берет некоторую информацию из объектного отчета и записывает ее в электронную таблицу Excel (однако я использую openpyxl, для загрузки рабочей книги которой отформатировано ~ 20 с, и еще 20 ~ для ее сохранения, чтоостанавливает сервер от обработки новых запросов!)

Функция просто возвращает True или False (что и есть my_success), поскольку к объекту отчета присоединен путь к выходному файлу.

Я еще не совсем применил ни один из этих методов, поэтому они могут быть неверными, но просто искал некоторую справочную информацию.

Приветствия!

1 Ответ

1 голос
/ 17 октября 2019

IOLoop.run_in_executor и Executor.submit делают одно и то же, но возвращают разные типы. IOLoop.run_in_executor возвращает asyncio.Future, а Executor.submit возвращает concurrent.futures.Future.

Два типа Future имеют почти идентичные интерфейсы с одним важным отличием: только asyncio.Future может использоваться с await в сопрограмме. Цель run_in_executor - обеспечить это преобразование.

...