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

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

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

17 ответов

22 просмотра

Решит

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 другому процессу с эвейтом результата

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

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

Здравствуйте, хочу сделать HelloWorld в консоли Дельфи, но функция API ничего не выводит, что я делаю не так? program Hello; {$APPTYPE CONSOLE} uses System.SysUtils, WinAPI.Wi...
Sergey Vinogradov
20
лучше скажите, причём тут паскаль?
Alexey Kulakov
23
Вопрос на перед, на следующую пятницу. Сколько строк кода можно вешать на одного программиста, понятно что если проект хорошо написан то можно и миллион. Но есть же где то пре...
AlekseyK Kluchnikov
31
Немного оффтопа: а кто на чем сидит для осдева в плане ide/редактора? Последнее время сидел на vscode, но я его прям не могу нормально воспринимать, перешел на сlion, но меня...
Evg Resh
29
#include <stdio.h> #include <stdlib.h> #include <time.h> int** generate_table(int size_matrix) { int** matrix = (int**)malloc(size_matrix * sizeof(int*)); for (int i ...
Чувак
1
@PerlBanjoBot use v5.38; sub split_on_cond($arr, $cond) { ($a, $b) = ([], []); push @{ $cond->($_) ? $a : $b }, $_ for @$arr; ($a, $b) } use Data::Dumper; warn Dumpe...
Sergei Zhmylove
10
Всем привет! как узнать, что текст в TSkLabel был выведен сокращенным ? Есть функция для TLabel которая позволяет определить , что текст выведен сокращенным function TFrmMai...
DELPHI SOLUTIONS
6
Вот объясните, как это работает: Вот есть допустим unix-подобная система, и программа запускает допустим printf или fork, как это передается ядру, и как оно обрабатывать начин...
Егор
14
Дебил? Я ищу друга
Bitard 228
27
У меня это всегда вопрос вызывало.. Нафига писать код так, чтобы потом ошибки вылавливать?
Nik
44
Карта сайта