@nodejs_ru

Страница 637 из 2748
Славик
05.03.2017
20:04:33
обращайтесь

Dan
05.03.2017
20:05:29
но вообще https://habrahabr.ru/post/150788/ всё объясняет

в любом случае спасибо за информацию

Google
Vladimir
05.03.2017
20:10:28
Я с Java пришёл. Этот принцип - просто синдром утенка
я с питона пришёл и ставлю точку с запятой в большенстве случаев. так что такое себе утверждение

Дмитрий
05.03.2017
20:10:51
Shit happens

Aleh
05.03.2017
20:11:22
воу

Дмитрий
05.03.2017
20:12:20
воу
М?)

Алексей
05.03.2017
20:13:11
Асинхронность, Promise, async/await - это почти тоже самое, что и потоки, только переключение происходит в предсказуемых местах, а не посреди выполнения абсолютно любой машинной инструкции. Следовательно проблемы синхронизации, дедлоков и гонок полностью исчезают. Такая модель удобна для подавляющего большенства практических задач за исключением выполнения длительных и тяжёлых вычислений, нагружающих CPU. Если вы проводите такие вычисления на NodeJS, то вы скорее всего куда-то не туда повернули в своей жизни. Если вы уверены в своей правоте и хотите дробить числа и перемножать матрицы именно на NodeJS, то лучше всё-таки вынести всё это дело в отдельный процесс.

Yan
05.03.2017
20:13:15
чёрт

а я истфака

ставлю то что по код стайлу

Google
Алексей
05.03.2017
20:14:38
Мораль сей басни такова: с точки зрения программиста асинхронность (с async/await, а не с callback hell) почти всегда лучше и удобнее, чем потоки.

Дмитрий
05.03.2017
20:14:50
Алексей
05.03.2017
20:15:22
про гонки неправда
что же там неправильного?

Aleh
05.03.2017
20:15:44
"полностью исчезают"

Дмитрий
05.03.2017
20:15:59
О даа

На промисах можно такую гонку наворотить, круче тур де франс

Алексей
05.03.2017
20:17:15
На промисах можно такую гонку наворотить, круче тур де франс
не надо чистые промисы, когда есть async/await

Дмитрий
05.03.2017
20:17:44
Это не принципиально

Алексей
05.03.2017
20:18:03
кстати, Питон со своим GIL тоже фактически однопоточным получается

причём там совсем всё плохо, так как собираются вместе часть недостатков потоков и асинхронности

Это не принципиально
в любом случае, на потоках гонку (и не только её) наворотить гораздо легче, чем в async/await

Aleh
05.03.2017
20:20:15
там есть асинхронность чуть что

Алексей
05.03.2017
20:21:03
там есть асинхронность чуть что
есть, да, можно всё асинхронно писать

тогда потоки вообще бесполезными становятся

и как вообще можно сделать гонку в NodeJS?

Дмитрий
05.03.2017
20:27:47
Просто посчитать, что одна асинхронная операция выполняется всегда быстрее другой (скорее всего, абсолютно неявно)

Готово, можете звать спортсменов

Особенно это весело, когда они реально должны выполняться параллельно, просто при этом случай, когда B дольше A автору не попадался

Алексей
05.03.2017
20:33:15
ну как бы есть Promise.all

для ожидания всех нужных запущенных асинхронных операций

Google
Алексей
05.03.2017
20:34:04
без всяких пердположений о скорости выполнения каждой из них

Дмитрий
05.03.2017
20:36:38
Очень хорошо рассуждать в теории

И на двух отдельно взятых объектах

К сожалению, в местах, где возникают такие ситуации, всё обстоит обычно слегка иначе

Алексей
05.03.2017
20:37:27
если вы хотите порассуждать на практике, то предоставьте код, который показывает проблему

может я чего-то недопонимаю

Просто для удобства программистов ничего более предсказуемого, чем ручного переключения контекста (async/await) парраллельных единиц (корутин или потоков) не придумали. И если и в этом случае делать такие ошибки, то тут уже ничего не поможет.

Дмитрий
05.03.2017
20:42:12
Если я кину ссылку на либу целиком, то это будет некорректным примером

Но к сожалению, когда всё понятно, то и проблем нет, но так бывает далеко не всегда

Алексей
05.03.2017
20:42:50
Ну хотя бы некий небольшой пример кода.

Дмитрий
05.03.2017
20:43:20
Первые 2 тысячи строк сойдет?

Ошибка в том, что почему то берется по умолчанию, что в коде всё предельно ясно и логически по фен шую

Алексей
05.03.2017
20:44:00
что-то сомневаюсь, но можно попробовать

Denis
05.03.2017
20:44:41
ну есть реактивные библиотеки которые решают множество таких проблем

Особенно это весело, когда они реально должны выполняться параллельно, просто при этом случай, когда B дольше A автору не попадался

типа RxJS

Алексей
05.03.2017
20:45:49
да даже async/await и Promise.all уже решают

Denis
05.03.2017
20:46:07
у них встроенные методы почти под все виды так сказать синхронизации асинхронных событий

Дмитрий
05.03.2017
20:47:25
Окей, вот вам максимально краткий пример

Если мы выполняем вот эту функцию, то авторизация проходит по плану https://github.com/zerobias/telegram-mtproto/blob/develop/src/bin.js#L332 Если мы заменяем код на абсолютно аналогичный (инфа 100%) из другой библиотеки, то с вероятностью в 30% падаем в 404, потому что вычисления идут дольше чем запланировано и определенный код не срабатывает https://github.com/zerobias/telegram-mtproto/blob/cbdc272e8cd17ef96312560f0504d6b47554f4f2/source/bin.js#L534

Google
Дмитрий
05.03.2017
20:50:22
Когда найдете причину, оформите пул реквест и разбудите меня из летаргического сна

Надеюсь, я достаточно красочно проиллюстрировал суть проблем при состояниях гонки и почему причина не в том что "можно заюзать Promise.all"

Vladimir
05.03.2017
20:52:38
Это какой то плохой пример

Дмитрий
05.03.2017
20:52:47
Я к тому же, ага

Vladimir
05.03.2017
20:52:50
Тут все синхронно

Дмитрий
05.03.2017
20:52:55
Потмоу что в хороших примерах нет проблемы

Тут все синхронно
Здорово, правда?

Влад
05.03.2017
20:53:21
Всем привет, товарищи , подскажите глупому , можно ли найти вещественное решение системы из n линейных уравнений при m(m>n) неизвестных ? #offtop

Vladimir
05.03.2017
20:53:26
Просто видимо за счет этой операции ты меняешь тайминг асинхронной операции, которая ее вызывает

Admin
ERROR: S client not available

Дмитрий
05.03.2017
20:54:30
Там много "почему", на самом деле, в этом и причина

Просто меня пытаются убедить в том, что состояния гонки - это от того, что можно заюзать %method_name%, когда на самом деле проблема в том, что иногда очень объёмные части самого разного кода действуют параллельно

Этот метод вызывается, кажется, несколько тысяч раз за пару секунд

Vladimir
05.03.2017
20:55:59
Ну эта проблема можно быть глобально только есть бесконтрольная мутация глобального стейта

Алексей
05.03.2017
20:56:13
я думаю очевидно, что в синхронном коде не может быть проблем с асинхронностью, если он не использует изменяемые объекты

Vladimir
05.03.2017
20:56:17
Если этого нет, то это проблема вполне локальная

И просто заключается в том что ты не дожидаешься какой то операции

Дмитрий
05.03.2017
20:56:51
Хорошее определение для фразы "состояние гонки", но проблему решить оно не позволяет

Алексей
05.03.2017
20:57:10
если проблема есть, то не в этом коде, а в том, который его вызывает

Vladimir
05.03.2017
20:57:38
Вполне позволяет, в тех случаях о которых я говорю

Google
Дмитрий
05.03.2017
20:57:49
Авторизация использует точный тайминг на данный момент, от тяжёлых вычислений часы слегка рассинхронизируются

Vladimir
05.03.2017
20:58:17
Если ты где то запускаешь операцию, которая асинхронно мутирует глобальный стейт, то просто не нужно так делать

Такие моменты действительно сложно определить

Дмитрий
05.03.2017
20:58:50
Хорошо, когда буду мутировать, сообщу

Vladimir
05.03.2017
20:59:19
Судя по твоему описанию проблемы, ты уже это делаешь

Vladimir
05.03.2017
21:00:49
Да, это из другой оперы

Алексей
05.03.2017
21:03:18
Если ты где то запускаешь операцию, которая асинхронно мутирует глобальный стейт, то просто не нужно так делать
Можно на самом деле, только очень аккуратно и постоянно держать в голове то, что этот объект может быть изменён где-то в другом месте. И крутость однопоточной асинхронности заключается в том, что даже нетривиальные изменения будут внесены атомарно (если конечно не написать внутри кода внесения изменений await something()).

Дмитрий
05.03.2017
21:14:21
а вот это уже интересно, правда я бы не назвал это гонкой
Задержку можно нивелировать на любом из тех этапов, что ведут к этому коду, но декомпенсация слишком рано или слишком поздно опять приводят к отказу в авторизации, а автор этого кода сделал реализацию с помощью deferred promise Самое веселое - при реализации с помощью async await запросы периодически вновь начинают сбоить и пролетать мимо, потому что слишком много дополнительных вычислений. Реализация async с помощью генераторов например чуть быстрее, но тоже иногда падает. Где это компенсировать по прежнему не ясно. Всё крутится вокруг того кода, что я указал и пары других криптографических методов

Если хотите чистых примеров, то есть фрагмент кода, который работает (не всегда) при задержке в 100 мс и не работает при любой попытке её исправить)) Включая setImmediate и прочие очевидные варианты

Aleh
05.03.2017
21:16:39
я б посмотрел

Дмитрий
05.03.2017
21:16:51
Короче, гонка, это когда не понятно почему, а не как исправить. Были бы все приложения в два промиса, связываемые через all -- гонки бы точно не было)

я б посмотрел
https://github.com/zerobias/telegram-mtproto/blob/5fe3a263d2a4e6d3ed1a2472d81786da500ac66e/lib/net/encrypted-rpc-channel.js#L65 Предупреждаю, там портал в ад

P.S. Комментарий лжёт

Алексей
05.03.2017
21:22:13
https://github.com/zerobias/telegram-mtproto/blob/5fe3a263d2a4e6d3ed1a2472d81786da500ac66e/lib/net/encrypted-rpc-channel.js#L65 Предупреждаю, там портал в ад
поверхностный взгляд на код приводит к такому вопросу: а что если callback не определён? или такого не может быть?

то есть запихивание callback в this._callbackMap может происходить после вызова EncryptedRpcChannel.prototype._onRpcResult?

Алексей
05.03.2017
21:27:45
ага и этот if теоретически может не сработать, то есть callback вполне может быть undefined

может в этом проблема?

Дмитрий
05.03.2017
21:29:12
Чтобы не описывать месяц экспериментов, просто скажу, что стоит ограничиться случаем, когда callback заведомо существует и if (callback) - это пожалуй единственное, на что можно положиться в этом коде

Автор знает callback hell как свой родной дом

Страница 637 из 2748