Алексей
Просто для удобства программистов ничего более предсказуемого, чем ручного переключения контекста (async/await) парраллельных единиц (корутин или потоков) не придумали. И если и в этом случае делать такие ошибки, то тут уже ничего не поможет.
Anonymous
Если я кину ссылку на либу целиком, то это будет некорректным примером
Anonymous
Но к сожалению, когда всё понятно, то и проблем нет, но так бывает далеко не всегда
Алексей
Ну хотя бы некий небольшой пример кода.
Anonymous
Первые 2 тысячи строк сойдет?
Anonymous
Ошибка в том, что почему то берется по умолчанию, что в коде всё предельно ясно и логически по фен шую
Алексей
что-то сомневаюсь, но можно попробовать
Denis
ну есть реактивные библиотеки которые решают множество таких проблем
Denis
Особенно это весело, когда они реально должны выполняться параллельно, просто при этом случай, когда B дольше A автору не попадался
Denis
типа RxJS
Алексей
да даже async/await и Promise.all уже решают
Denis
у них встроенные методы почти под все виды так сказать синхронизации асинхронных событий
Anonymous
Окей, вот вам максимально краткий пример
Anonymous
Если мы выполняем вот эту функцию, то авторизация проходит по плану
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
Anonymous
Когда найдете причину, оформите пул реквест и разбудите меня из летаргического сна
Anonymous
Надеюсь, я достаточно красочно проиллюстрировал суть проблем при состояниях гонки и почему причина не в том что "можно заюзать Promise.all"
Vladimir
Это какой то плохой пример
Anonymous
Я к тому же, ага
Vladimir
Тут все синхронно
Anonymous
Потмоу что в хороших примерах нет проблемы
Влад
Всем привет, товарищи , подскажите глупому , можно ли найти вещественное решение системы из n линейных уравнений при m(m>n) неизвестных ?
#offtop
Vladimir
Просто видимо за счет этой операции ты меняешь тайминг асинхронной операции, которая ее вызывает
Anonymous
Там много "почему", на самом деле, в этом и причина
Anonymous
Просто меня пытаются убедить в том, что состояния гонки - это от того, что можно заюзать %method_name%, когда на самом деле проблема в том, что иногда очень объёмные части самого разного кода действуют параллельно
Anonymous
Этот метод вызывается, кажется, несколько тысяч раз за пару секунд
Vladimir
Ну эта проблема можно быть глобально только есть бесконтрольная мутация глобального стейта
Алексей
я думаю очевидно, что в синхронном коде не может быть проблем с асинхронностью, если он не использует изменяемые объекты
Vladimir
Если этого нет, то это проблема вполне локальная
Vladimir
И просто заключается в том что ты не дожидаешься какой то операции
Anonymous
Хорошее определение для фразы "состояние гонки", но проблему решить оно не позволяет
Алексей
если проблема есть, то не в этом коде, а в том, который его вызывает
Vladimir
Вполне позволяет, в тех случаях о которых я говорю
Anonymous
Авторизация использует точный тайминг на данный момент, от тяжёлых вычислений часы слегка рассинхронизируются
Vladimir
Если ты где то запускаешь операцию, которая асинхронно мутирует глобальный стейт, то просто не нужно так делать
Vladimir
Такие моменты действительно сложно определить
Anonymous
Хорошо, когда буду мутировать, сообщу
Vladimir
Судя по твоему описанию проблемы, ты уже это делаешь
Алексей
Vladimir
Да, это из другой оперы
Алексей
Anonymous
а вот это уже интересно, правда я бы не назвал это гонкой
Задержку можно нивелировать на любом из тех этапов, что ведут к этому коду, но декомпенсация слишком рано или слишком поздно опять приводят к отказу в авторизации, а автор этого кода сделал реализацию с помощью deferred promise
Самое веселое - при реализации с помощью async await запросы периодически вновь начинают сбоить и пролетать мимо, потому что слишком много дополнительных вычислений. Реализация async с помощью генераторов например чуть быстрее, но тоже иногда падает. Где это компенсировать по прежнему не ясно. Всё крутится вокруг того кода, что я указал и пары других криптографических методов
Anonymous
Если хотите чистых примеров, то есть фрагмент кода, который работает (не всегда) при задержке в 100 мс и не работает при любой попытке её исправить)) Включая setImmediate и прочие очевидные варианты
Ale
я б посмотрел
Anonymous
Короче, гонка, это когда не понятно почему, а не как исправить. Были бы все приложения в два промиса, связываемые через all -- гонки бы точно не было)
Anonymous
я б посмотрел
https://github.com/zerobias/telegram-mtproto/blob/5fe3a263d2a4e6d3ed1a2472d81786da500ac66e/lib/net/encrypted-rpc-channel.js#L65
Предупреждаю, там портал в ад
Anonymous
P.S. Комментарий лжёт
Алексей
Алексей
то есть запихивание callback в this._callbackMap может происходить после вызова EncryptedRpcChannel.prototype._onRpcResult?
Anonymous
Алексей
ага и этот if теоретически может не сработать, то есть callback вполне может быть undefined
Алексей
может в этом проблема?
Anonymous
Чтобы не описывать месяц экспериментов, просто скажу, что стоит ограничиться случаем, когда callback заведомо существует и if (callback) - это пожалуй единственное, на что можно положиться в этом коде
Anonymous
Автор знает callback hell как свой родной дом
Алексей
хотя нет, не должно
Алексей
ну так на колбеках сделать гонку проще простого
Алексей
проблема возникает, когда авторизация выполняется слишком быстро или слишком медленно?
Anonymous
Ну вот до этого скидывал реализацию на промисах, там те же проблемы
Anonymous
Anonymous
Не стоит пытаться это с наскоку решить, это всего лишь пример)
Алексей
это быстродействие является тригером ошибки, похоже разные способы реализации одного куска кода меняют скорость выполнения этого кода и вызывает или не вызывает ошибку где-то в другом месте
Anonymous
Примерно так, да
Алексей
и вот в этом месте и кроится ошибка, а не в том коде, скорость которого меняется
Алексей
это именно в коде проблема или просто телеграм не любит, когда авторизация идёт слишком долго?
Anonymous
В коде, текущая реализация там не сбоит. Эти магические 100 мс весьма неявным образом полагаются на выполнение одного метода в соседнем классе
Paruyr
Что нового в Sequelize v4?
andrei
kdm🇩🇰
гайс
kdm🇩🇰
глупый вопрос
kdm🇩🇰
что такое next?
kdm🇩🇰
в контексте node js, в примерах вижу его к примеру (err,result,next)
Artur
kdm🇩🇰
она выпролняется когда вызывается коллбэк?
Smooth Operator
ты ее вызываешь когда хочешь передать управление дальше, функцию – next()
kdm🇩🇰
используем базу данных mysql и драйвер mysql
нужно вставить две записи в бд
после того как будет вставлена первая запись, надо сделать запись второй, так как она содержит ссылку на первую
с помощью чего это можно реализовать?
async.waterfall?
kdm🇩🇰
connection.query('INSERT INTO ' + dbconfig.database + '.' + dbconfig.companies_table + ' \
SET ?', testCompany, (err, result, next)=>{
if(err){
console.log(err);
return;
}
console.log(result);
testUser.companyId = result.insertId;
//тут надо вставить тестового пользователя
});
Artur
await query1()
await query2()
kdm🇩🇰
о спасибо, как раз про это ща читал)
Artur
Для этого надо чтобы драйвер БД использовад промисы