170 похожих чатов

Тишка, к тебе вопрос, если я буду запускать в aiohttp

сервере CPU bound функции в ThreadPoolExecutor понятно что быстрее работать не станет, но это же решит проблему с блокировкой ивент лупа? По идеи поток должен отпускать GIL и ивент луп сможет нормально делегировать, ведь так? Или лучше запускать cpu bound в ProcessPoolExecutor?

17 ответов

24 просмотра

Решит

Andrey-Sapronov Автор вопроса
Tishka17
Решит

Ок, благодарю, а второе решение запускать в ProcessPoolExecutor имеет какое-то преимущество если у меня 1 процесс только? Или наоборот будет чуть медленным из-за выделения ресурсов дополнительных?

Andrey-Sapronov Автор вопроса
Tishka17
Зависит от ситуации: кода, ОС, данных

Я попробовал оба, в случаи с ProcessPoolExecutor 1000 вызовов функции выполняется за 27 сек, а в потоке за 25 сек. Но вот боюсь не будет ли cpu bound мешать ивент лупу..

Tishka17
Решит

Разве? Гил же шарится между всеми тредами. Соответственно в одном треде ты уперся в cpu-bound операцию и для работы над ней этот один тред забирает себе общий лок и остальные соответственно стоят. Я так так это понимаю.

Tishka17
Ну не вечно же

Да, но мне казалось что вот этот момент времени он может "убить" такое асинхронное приложение когда все остальные корутины не двигаются по событийному циклу. По крайней мере, если у тебя достаточно большое колличество одномоментных запросов в приложение.

Alex
Да, но мне казалось что вот этот момент времени он...

Так в асинке вообще один поток даже без гила

Alex
Разве? Гил же шарится между всеми тредами. Соответ...

Потоки это вытесняющая многозадачность, а вот asyncio реализует кооперативную. Поэтмоу даже если поток упирается в cpu bound, это не помешает остальным потокам. Но в тасках asyncio/aiohttp это не верно, и cpubound таска заблокирует всех остальных, если принудительно ее на эвейтить.

Michael Pokrovsky
Как можно заэвейтить cpu bound операцию?

Например обернуть в Future. В питоне прям целая либа встроена просто реалищующая этот паттерн https://docs.python.org/3/library/concurrent.futures.html

Alex
Например обернуть в Future. В питоне прям целая ли...

Завернуть в future и отправить в ProcessPoolExecutor?

Michael Pokrovsky
Завернуть в future и отправить в ProcessPoolExecut...

Нет. Пул сам дает тебе такой "талончик" на получение результата в будущем когда ты даешь ему таск. https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Executor.submit

Alex
Нет. Пул сам дает тебе такой "талончик" на получен...

Ну технически твоя таска будет выполняться уже не в корутине главного потока, а уйдёт в другой другой (дочерний) процесс. А корутина из главного потока внутри эвент лупа будет эвейтить футуру? Так получается?

Michael Pokrovsky
Ну технически твоя таска будет выполняться уже не ...

Да. Хотя у asyncio есть свой интерфейс для работы с future который предпочтительней, но в целом все работает так.

Alex
Да. Хотя у asyncio есть свой интерфейс для работы ...

Ну это делегирование выполнения cpu bound другому процессу с эвейтом результата

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

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта