Size: a a a

2020 August 08

SP

Sergey Protko in PHP
это не взаимозаменяемые концепты. У тебя может быть пул потоков (паралельное выполнение) которое внутри крутит блокирующий синхронный код дабы добиться асинхронности в другом треде
источник

AM

Artem Molotov in PHP
Sergey Protko
синхронно vs асинхронно это про то что кусочки твоей программы выполняются в определенном порядке или в рандомном порядке.

Например вот у тебя есть две функции:

async function foo(i) {
   await first(i);
   await second(i);
}

await Promise.all([
   foo(1),
   foo(2)
])


в случае синхронной работы у тебя порядок в котором будет выполняться код целиком и полностью зависит от порядка вызова и записи выражений:

- first(1)
- second(1)
- first(2)
- second(2)

Асинхронно наоборот - мы не можем знать заранее в каком порядке будут выполняться операции

- first(1)
- first(2)
- second(2) // потому что раньше успел отработать first2
- second(1) // потому что не успел

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

Так же есть блокирующие и не блокирующие вызовы.

const data = socket.read(1024)


в этом случае весь поток выполнения будет заблокирован пока клиент тебе пришлет все 1024 байт информации или же пока не закроется коннекшен. И пока это не произойдет никто ничего не выполняет. Процесс по сути в idle

Есть так же понятие паралельных вычислений. Это когда у тебя операции могут во времени пересекаться. Например ты в одном потоке пишешь в файл а в другом читаешь, и эти операции могут накладываться во времени. А что мы знаем про время? что человеческие мозги не умеют процессы разворачивающиеся во времени красиво крутить, потому паралельное вычисление с общей памятью это боль и слезы. И как говорил кто-то (не помню то ли фаулер толи еще кто) - "в мире возмо есть человек 5 которые достаточно квалифицированы что бы работать с тредами и это не я).
> в случае синхронной работы у тебя порядок в котором будет выполняться код целиком и полностью зависит от порядка вызова и записи выражений

Можно записать без какого-либо порядка в асинхронном месте, но заюзать мьютексы/семафоры, тем самым заблочив выполнение и сделав код синхронным
источник

AM

Artem Molotov in PHP
херово написал, но вроде +- мысль понятна
источник

AM

Artem Molotov in PHP
ну и в целом это говно, если делать как я описал (ибо смысла крайне мало)
источник

A

Aleksandr Khristenko in PHP
Sergey Protko
синхронно vs асинхронно это про то что кусочки твоей программы выполняются в определенном порядке или в рандомном порядке.

Например вот у тебя есть две функции:

async function foo(i) {
   await first(i);
   await second(i);
}

await Promise.all([
   foo(1),
   foo(2)
])


в случае синхронной работы у тебя порядок в котором будет выполняться код целиком и полностью зависит от порядка вызова и записи выражений:

- first(1)
- second(1)
- first(2)
- second(2)

Асинхронно наоборот - мы не можем знать заранее в каком порядке будут выполняться операции

- first(1)
- first(2)
- second(2) // потому что раньше успел отработать first2
- second(1) // потому что не успел

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

Так же есть блокирующие и не блокирующие вызовы.

const data = socket.read(1024)


в этом случае весь поток выполнения будет заблокирован пока клиент тебе пришлет все 1024 байт информации или же пока не закроется коннекшен. И пока это не произойдет никто ничего не выполняет. Процесс по сути в idle

Есть так же понятие паралельных вычислений. Это когда у тебя операции могут во времени пересекаться. Например ты в одном потоке пишешь в файл а в другом читаешь, и эти операции могут накладываться во времени. А что мы знаем про время? что человеческие мозги не умеют процессы разворачивающиеся во времени красиво крутить, потому паралельное вычисление с общей памятью это боль и слезы. И как говорил кто-то (не помню то ли фаулер толи еще кто) - "в мире возмо есть человек 5 которые достаточно квалифицированы что бы работать с тредами и это не я).
Ну смотри, я каждый async могу заменить на отдельный тред, а await на join этого треда. Порядок тоже будет неорпделен.
Но это же будет не то, что подразумевают под асинронным программированием?
источник

SP

Sergey Protko in PHP
Aleksandr Khristenko
Ну смотри, я каждый async могу заменить на отдельный тред, а await на join этого треда. Порядок тоже будет неорпделен.
Но это же будет не то, что подразумевают под асинронным программированием?
ну тут вопрос, мы про терминологию или про "веяния".

Как именно ты реализуешь асинхронность не столь важно, под копотом у тебя пул тредов которые заворачивают синхронные системные вызовы либо же у тебя там неблокирующие операции и epoll/select
источник

A

Aleksandr Khristenko in PHP
Т.е. может я что-то путаю но под async в языках обычно подразумевается переход на полностью неблокирующее общение с внешним миром + обвязки вокруг этого.
источник

АГ

Алексей Гевондян... in PHP
проблема только одна: не понятно, когда будет результат. поэтому промисы...
источник

SP

Sergey Protko in PHP
смысл больше в том что паралелизм это про возможность одновременного выполнения операций. А асинхронность про порядок в котором операции выполняются. ты не можешь заменить одно другим поскольку это про разные вещи.
источник

AM

Artem Molotov in PHP
Aleksandr Khristenko
Т.е. может я что-то путаю но под async в языках обычно подразумевается переход на полностью неблокирующее общение с внешним миром + обвязки вокруг этого.
> переход на полностью неблокирующее общение

где-то всё равно будут точки синхронизации, если что.
источник

SP

Sergey Protko in PHP
слова которые мы юзаем (сихронность, паралельность) не спроста такие)
источник

A

Aleksandr Khristenko in PHP
https://en.wikipedia.org/wiki/Asynchrony_(computer_programming) - вот тут тоже сделан акцент на "without the program blocking to wait for results"
источник

SP

Sergey Protko in PHP
Aleksandr Khristenko
https://en.wikipedia.org/wiki/Asynchrony_(computer_programming) - вот тут тоже сделан акцент на "without the program blocking to wait for results"
оукей, давай подискутируем что такое "программа") могу ли я назвать тред который просит другие треды из файликов мне почитать через синхронные системные вызовы программой?)
источник

AM

Artem Molotov in PHP
вот и проходи после таких обсуждений тестики на повышение квалификации и прочего, где ответы а, б, в
источник

SP

Sergey Protko in PHP
опять же паралельное выполнение можно делать не только тредами - этот механизм у тебя есть за счет операционки только.
источник

SP

Sergey Protko in PHP
да и "неблокирующие операции" - они чуть чуть да блокируют насколько я помню
источник

A

Aleksandr Khristenko in PHP
Sergey Protko
оукей, давай подискутируем что такое "программа") могу ли я назвать тред который просит другие треды из файликов мне почитать через синхронные системные вызовы программой?)
Я, если что не пытаюсь переубедить, я пытаюсь понять термин асинхронного программирования.
источник

AM

Artem Molotov in PHP
Sergey Protko
да и "неблокирующие операции" - они чуть чуть да блокируют насколько я помню
наличие хоть одного await'а уже блокирующая операция в контексте некоторой части кода
источник

SP

Sergey Protko in PHP
Aleksandr Khristenko
Я, если что не пытаюсь переубедить, я пытаюсь понять термин асинхронного программирования.
> Asynchrony, in computer programming, refers to the occurrence of events independent of the main program flow and ways to deal with such events.
источник

SP

Sergey Protko in PHP
Artem Molotov
наличие хоть одного await'а уже блокирующая операция в контексте некоторой части кода
потому обычно async/await называют работой с асинхронными операциями в синхронном стиле
источник