Оптимизирован ли run_in_executor для работы в цикле с сопрограммами?

@Dan,

Похоже, вы пытаетесь использовать RTTI UDT. Я не думаю, что вы действительно можете получить эту информацию, не зная о UDT перед временем выполнения. Чтобы начать работу, попробуйте:

Понимание UDTs Из-за отсутствия возможности отражения. Я бы создал свой собственный RTTI для своих UDT.

Чтобы дать вам базовый уровень. Попробуйте это:

Type test
    RTTI as String
    a as Long
    b as Long 
    c as Long
    d as Integer
end type

Вы можете написать утилиту, которая откроет каждый исходный файл и добавит RTTI с именем типа в UDT. Вероятно, было бы лучше поместить все UDT в общий файл.

RTTI будет примерно таким:

«String: Long: Long: Long: Integer»

Используя память UDT, вы можете извлечь значения.

1
задан JSStuball 6 March 2019 в 16:32
поделиться

1 ответ

Вы всегда можете запустить другой поток вручную, но тогда вы несете ответственность за его работу, например, используя очередь. В Python 3 concurrent.futures предоставляется удобный API для выгрузки задач в пул потоков. Метод submit берет функцию, передает ее потоку в пуле для ее запуска и немедленно возвращает дескриптор, который предоставит результат (или распространит исключение), когда он будет готов. [1116 ]

run_in_executor о том, чтобы принести это удобство в asyncio. Обычно вы не должны запускать блокирующий код внутри asyncio - даже что-то простое, например, time.sleep(), запрещено, поскольку оно блокирует весь цикл обработки событий. run_in_executor позволяет нарушить это правило. Например:

async def sleep_test():
    loop = asyncio.get_event_loop()
    print('going to sleep')
    await loop.run_in_executor(None, time.sleep, 5)
    #time.sleep(5)
    print('waking up')

asyncio.run(asyncio.gather(sleep_test(), sleep_test()))

Запуск этого кода показывает, что оба экземпляра сопрограммы спят параллельно. Если бы мы использовали time.sleep() напрямую, они бы спали последовательно, потому что сон заблокировал бы цикл событий.

Этот пример, конечно, глуп, потому что есть asyncio.sleep() , который делает все это эффективно, но он показывает основную идею. Реальные варианты использования для run_in_executor включают в себя:

  • запуск кода с привязкой к ЦП, например, вычисления с пустыми частями, изнутри asyncio
  • вызов устаревшего кода, который еще не был перенесен в asyncio
  • блокирующие вызовы, когда неблокирующие API просто недоступны (драйверы баз данных, доступ к файловой системе)
0
ответ дан user4815162342 6 March 2019 в 16:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: