Size: a a a

2020 June 10

N

Nick Name in aiogram [ru]
Tishka17
Асинхронность (кооперативная мноозадачность):
У тебя есть очередь людей и один официант. Человек из очереди подходит, делает заказ, официант его передает поварам, человек отходит и ждет когда его позовут. Если ты пока делал заказ заболтался официантом или не отошел, все ждут.

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

Многопоточность в питоне:
Чтобы подбежать к повару, надо пробежать через калитку, где протиснется только один человек. Если у тебя нет личных контактов на кухне (c library), ты дальше пройти не можешь, поэтому все пихаются вокруг одной калитки. Но в целом много что решается на кухне
первое понял, два остальных нет(
не понимаю как это "потом подбегают и спрашивают не готово ли", точнее как это бы в коде выглядело
источник

T

Tishka17 in aiogram [ru]
Nick Name
первое понял, два остальных нет(
не понимаю как это "потом подбегают и спрашивают не готово ли", точнее как это бы в коде выглядело
ну прям рандомно сами бегают и отталкивают друг друга
источник

T

Tishka17 in aiogram [ru]
На самом деле конечно они бегают по земле (планировщик ОС), а не просто так и не могут мгновенно перемещаться в пространстве, но в целом земля не знает что у них на уме
источник

T

Tishka17 in aiogram [ru]
Иногда на земле расчерчены тропинки (примитивы синхронизации), но в целом никто не заставляет тебя бегать по ним. Но дружные люди стараются придерживаться их
источник

N

Nick Name in aiogram [ru]
Tishka17
ну прям рандомно сами бегают и отталкивают друг друга
хм, я думал если вызвать do_order в восьми потоках, то люди будут стоят и ждать до окончания заказа. пока им не выдадут жратву
источник

<Юрий> 👨‍🔬 Чеб... in aiogram [ru]
Nick Name
первое понял, два остальных нет(
не понимаю как это "потом подбегают и спрашивают не готово ли", точнее как это бы в коде выглядело
все эти штуки НЕ происходят в ТВОЕМ коде. они происходят уровнем ниже, там где интерпретатор работает. ты только выбираешь один из этих подходов к организации задачи
источник

T

Tishka17 in aiogram [ru]
Nick Name
хм, я думал если вызвать do_order в восьми потоках, то люди будут стоят и ждать до окончания заказа. пока им не выдадут жратву
ну плюс-минус, зависит от реализации заказа (см выше про дорожки на земле)
источник

Т

Технопёс in aiogram [ru]
Tishka17
Насколько понимаю, именно когда сделать. У тебя есть подготовленная речь заказа, но сам заказ ты ещё не начнешь делать пока не позовут
Ну если мы говорим о готовке заказа как об асинхронной задаче (я надеюсь), то в момент авайта эта самая задача "готовится", и как только будет результат, луп вернет управление туда, где был применен await. Пока она готовится, луп занимается другим делом, и когда у него тоже встанет ожидание, он возьмется за третье. Например, задача поставить пирог в печку. Первый вызов await - ставим в печку, ждем. Тут снова вызов await, и так как мы (луп) в простое и ничего не делаем, также ставим второй пирог в печку. И так со всеми следующими пирогами. Все готовятся, а мы просто ожидаем результаты, чтобы начать отдавать пироги
источник

T

Tishka17 in aiogram [ru]
Технопёс
Ну если мы говорим о готовке заказа как об асинхронной задаче (я надеюсь), то в момент авайта эта самая задача "готовится", и как только будет результат, луп вернет управление туда, где был применен await. Пока она готовится, луп занимается другим делом, и когда у него тоже встанет ожидание, он возьмется за третье. Например, задача поставить пирог в печку. Первый вызов await - ставим в печку, ждем. Тут снова вызов await, и так как мы (луп) в простое и ничего не делаем, также ставим второй пирог в печку. И так со всеми следующими пирогами. Все готовятся, а мы просто ожидаем результаты, чтобы начать отдавать пироги
А мне казалось переключение происходит на КАЖДОМ вызове await, а не на последнем по глубине вызова.  Вот твой код:
1. await сделать заказ
1.1. синхронно (слепить пирог)
1.2 await поставить пирог в печку
1.3 await готовый пирог

1.1-1.3 - выполняется внутри функции "сделать заказ", но ты будешь ждать когда тебя позовут и на пункте 1 и на пунктах 1.2, 1.3
источник

Т

Технопёс in aiogram [ru]
Tishka17
А мне казалось переключение происходит на КАЖДОМ вызове await, а не на последнем по глубине вызова.  Вот твой код:
1. await сделать заказ
1.1. синхронно (слепить пирог)
1.2 await поставить пирог в печку
1.3 await готовый пирог

1.1-1.3 - выполняется внутри функции "сделать заказ", но ты будешь ждать когда тебя позовут и на пункте 1 и на пунктах 1.2, 1.3
Да, на каждом, но только если луп свободен и просто ожидает
источник

Т

Технопёс in aiogram [ru]
Он же может делать только одну задачу в любой момент времени
источник

<Юрий> 👨‍🔬 Чеб... in aiogram [ru]
Tishka17
А мне казалось переключение происходит на КАЖДОМ вызове await, а не на последнем по глубине вызова.  Вот твой код:
1. await сделать заказ
1.1. синхронно (слепить пирог)
1.2 await поставить пирог в печку
1.3 await готовый пирог

1.1-1.3 - выполняется внутри функции "сделать заказ", но ты будешь ждать когда тебя позовут и на пункте 1 и на пунктах 1.2, 1.3
блин какая же хорошая аналогия, а если займёшься блокирующей операцией и забудешь вовремя достать пирог то он сгорит)
источник

T

Tishka17 in aiogram [ru]
ну переключение может быть на тот же таск, что был до переключения
источник

T

Tishka17 in aiogram [ru]
суть в том, что сам вызов await говорит "ну вы там разберитесь кто следующий что-то делает"
источник

Т

Технопёс in aiogram [ru]
Tishka17
А мне казалось переключение происходит на КАЖДОМ вызове await, а не на последнем по глубине вызова.  Вот твой код:
1. await сделать заказ
1.1. синхронно (слепить пирог)
1.2 await поставить пирог в печку
1.3 await готовый пирог

1.1-1.3 - выполняется внутри функции "сделать заказ", но ты будешь ждать когда тебя позовут и на пункте 1 и на пунктах 1.2, 1.3
Может я тебя не так понял? 😅 Ты пишешь, что по await корутина еще не выполняется, а только ждет начала своей обработки. Это справедливо только в том случае, если луп занят. Если он свободен, он возьмет и начнет делать, до следующего простоя. Ну, и соответственно, в моменты простоя он может делать другие задачи, переключать контекст выполнения на них
источник

T

Tishka17 in aiogram [ru]
для меня занят и свободен определяет то, между чем можно переключаться
источник

T

Tishka17 in aiogram [ru]
если у тебя в лупе 2 готовые задачи - будет переключение между ними, если 1 - только на ней
источник

T

Tishka17 in aiogram [ru]
Как именно определяется "готовность" задачи - определяется реализацией лупа
источник

Т

Технопёс in aiogram [ru]
Так я не говорил о вложенности, речь шла про однородные задачи готовки
источник

T

Tishka17 in aiogram [ru]
Ну окей, смотря как реализована "сделать заказ" может вернуться разный awaitable объект.
источник