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

Кто хорошо разбирается в event loop. Вот есть 2 фазы, во

время которых исполняется пользовательский код: timers phase и poll phase. Timers исполняет всякие таймеры, а poll i/o. Но что насчёт остальных асинхронных запросов, например, запросы по сети? Или коллбек от дочерних процессов? Или коллбек от событий? Когда они обрабатываются

56 ответов

52 просмотра

Что такое коллбек от дочерних процессов в этом контексте

.sha- Автор вопроса

Например, стримы, когда кидают событие data— доступен новый кусок данных для чтения

.sha- Автор вопроса

Например, exec(‘command’, callback);

стримы - это те же event emitter, а коллбеки в них вызываются синхронно

.sha- Автор вопроса

Ок, ну остальные коллбеки, которые срабатывают асинхронно Дочерние процессы, сеть, коллбеки событий браузера типа onClick

.sha- Автор вопроса

Ну типа event loop и в node, и в браузере примерно одинаковый, нет? И там, и там v8

здесь я не уверен, но это тот же async i/o, на винде это просто вызов какой то WaitForObject, надо смотреть доки/сорсы ноды/libuv

dom api насколько знаю - синхронный, но я не эксперт, может поправять кто то здесь

.sha- Автор вопроса

Где-то вообще можно найти исчерпывающую информацию по event loop, кроме исходников libuv? На mdn и nodejs очень поверхностно, ещё читал на ibm developer, но там тоже нет деталей особо

а какая цель всего этого? постичь дзен евент лупа и распределять так задачи в реальности?

.sha- Автор вопроса

Понимать, что в каком порядке, как и именно и почему исполняется

статью не дам, не знаю такую, а какой толк от этих знаний будет?)) думаете что сразу высокоэффективный код будете писать?

.sha- Автор вопроса

Тут дело не в эффективности, а понимании того, как работает код Я как-то спорил с человеком насчёт такого кода: const items = queue; queue.length = 0; processItems(items); Суть спора — может ли что-то асинхронно прилететь между первой и второй строкой, что приведёт к потере данных. Я считаю, что нет, но доказать почему не смог

нет, и глубокое понимание каждой фазы эвент лупа здесь не нужно

в этом и фишка, что доказывание кому-то чего-то и стремление к знанию эт разные вещи)

Реализуй свой цикл

.sha- Автор вопроса

Звучит прикольно, я бы попробовал. А что именно исполнять? Я же не хочу учиться интерпретировать js с нуля

И там и там v8, но libuv только в ноде

запросы по сети обрабатываются наряду с i/o но i/o ранится на threads в то время как ОС сама разбирается с запросами по сети пните если неправильно

.sha- Автор вопроса

Хм. А почему так сложилось? Ведь и там, и там есть event loop.

Язык никак не связан с событийным циклом. Напиши на js свой собственный цикл через yield

Потому что браузер это не единое приложение, js, цикл событий, парсер css, парсер html, рендер html, рендер шрифтов - это всё независимые реализации, а браузер только склеивает всё воедино

.sha- Автор вопроса

Честно говоря, пока не очень представляю, как концептуально это должно выглядеть :С Что же будет исполняться / происходить в моем цикле, если не исполнение кода ?

while (true) { if (tasks.lenght) { // Выполняем нужны код } }

.sha- Автор вопроса

А, ну попробую. То есть симулировать эти очереди таймеров, очередь микротасок, очередь immediate, очередь событий close и попробовать сделать их обработку руками, приняв сами таски за объекты пустышки, т.к. это не важно А причём тут yield?

yield поможет реализовать async await, на колбеках писать это ад

.sha- Автор вопроса

Так стоп, то есть ты предлагаешь все таки брать и исполнять реальный js код, а не какие-то абстрактные объекты из массива tasks в примере выше?

Да, просто не используй все асинхронные абстракции: promise, async, settimeout

.sha- Автор вопроса

Жесть, ну вот я взял строку с js кодом Сначала надо разобрать на ast Потом... разбить на statements/expressions, я даже не знаю, как это делается, и потом как-то это исполнять, и только на этапе исполнения всплывает event loop? Или я не совсем так понял? Это ведь нужно реализовать все конструкции языка, встроенные объекты, и так далее

.sha- Автор вопроса

И все же, Sergey, как можно написать event loop для исполнения реального кода не реализовав весь процесс интерпретации js?

Не нужно тебе парсить js, ты событийный цикл пишешь, а не интегратор js. Пиши на обычном js и исполняй в ноде

Почитай что такое yield и за как работают астериск-функции)

.sha- Автор вопроса

Ну, например, Promise я могу переопределить, чтобы использовать свою кастомную логику. setTimeout тоже могу заменить на свою функцию. Но async-await же операторы, тут я не могу сделать кастомную обработку

.sha- Автор вопроса

У меня проблема не в понимании генераторов, а как написать свой ивент луп

вопрос - зачем?)

.sha- Автор вопроса

В образовательных целях

Тебе не нужно заменять, просто напиши свою реализацию в виде функции и не используй встроенных вещей

.sha- Автор вопроса

Вот пример: fs.readFile(‘path’).then(async contents => await fetch(...)); Цель была исполнить этот код со своим ивент лупом. Каким образом я могу это сделать не переопределив .then, .readFile и fetch?

че за мясо

.sha- Автор вопроса

Обсуждение идёт вообще не про качество кода в этом фрагменте Речь про обработку разных кейсов асинхронных запросов в своей реализации event loop

дай угадаю, ты безработный

А чего ты так решил?

если человек пишет then с async - он троль

Почему?

нуу, спорный момент на самом деле

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

.sha- Автор вопроса

Да я-то изучил. Доки libuv ещё не читал, правда. Сама идея реализации своего loop показалась интересной

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

уже видел как челик запустил DOOM на картошке ?)

Может немного поможет habr.com/ru/post/336498/

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

лол

ну если время, деньги есть можно их конвертировать в высокий уровень удивительности происходящего) это же очевидно)

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта