Код: Выделить всё
ThreadPoolExecutor
Я понимаю, что глобальная блокировка интерпретатора Python (GIL) позволяет только один поток выполнять байт -код Python за раз в процессе. Но я хочу уточнить, как это влияет на цикл событий Asyncio, когда множественные задачи < /strong>, связанные с процессором (скажем, 10), отправляются одновременно в пул потоков. < /P>
сценарий < /h2>
- . Пул потоков с несколькими рабочими потоками (например, 10 потоков).
- Десять синхронных задач, связанных с процессором, представлены почти одновременно, каждая из них работает за кодом Python, в котором хранятся GIL во время выполнения. /> < /ul>
Что я понимаю < /h2>
Когда поток удерживает GIL, нет другой нить или цикл событий, которые могут запускать Python Bytecode. < /li>
это. there’s no guarantee the event loop will get immediate priority. - Therefore, multiple CPU-bound tasks running concurrently in the thread pool can serially monopolize the GIL, delaying the event loop and causing increased latency and reduced responsiveness.
Точнее ли это понимание относительно того, как конфликт GIL влияет на цикл Asyncio Event? Это отдает предпочтение потоке цикла событий над теми работников в таких сценариях? < /li>
Есть ли рекомендуемые лучшие практики или архитектурные паттерны, чтобы избежать этой проблемы, помимо перемещения задач, связанных с процессором, к ProcessPoolexecutor < /code> или внешние услуги? Принимая во внимание использование ThreadPoolexeCutor < /code> в FastApi для выполнения некоторых блокирующих задач, связанных с процессором, асинхронно, но хочет понять последствия для реагирования на петлю события, когда несколько таких задач выполняются одновременно. < /p>
Заранее.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... un-concurr