Как стать автором
Обновить

Комментарии 14

А почему у Вас в цикле i < 10, а в выводе id отсутствуют 5,6,7,8, но зато повторяются 0,1,2?
Это я просто маленькую часть файла скопировал, и в первой версии выводит строки в случайном порядке, вот 0. 1 и 2 потоки как самые первые и начали вывод
блджад. Для начала сообщение раз в 100 миллисекунд это супер редко, вы просто не нарвались. Запустите каждый поток синхронно просто писать, без таймаута. Это раз. Второе, если оно синхронизировано — это ужасно, это очередной раз убийство производительности в угоду возможности привлечь к работе малограмотных работников. Вместо адекватного инструмента синхронизации, тупо сделать всегда просто потому что так удобно.
+1 к замедлению и склонения к неграмотному подходу к программированию.
1) мы пробовали запускать 100 потоков с 10 миллисекунд задержкой, результат был тот же. Оставил так как есть просто для наглядности.
2) Прошу вас, напишите здесь другой инструмент синхронизации Node.JS потоков)
Вы думаете 10мс достаточно? А что если на простые запросы бд могут отвечать за 10-100 наносекунд, это для сравнения. Вывод уж явно не медленее будет. Чтобы понять какую задержку сделать, надо хотя бы первоночально провести бенчмарк и определить как же быстро выводится строка с текстом. А к примеру когда я тестирую многопоточность, вообще никакие задержки не использую ибо вносят они очень большие погрешности.

А с паузами в 10-100мс, многопоточность и не нужна вовсе.
Чтобы никто не думал, что я жульничаю, я обновил статью и код, убрав все таймауты.
Специально ради вас проверил: 100 потоков, каждый while(true){ sendMessage()}. Файл всё так же не каша.

Хочется увидеть верстю с createWriteStream

Поверьте, она не стоит того, чтобы показывать)
меняем метод log у логера на function getStream(){
return fs.createWriteStream('./my-file.txt');
}
при инициализации потоков они сразу берут стрим в виде const fs = logger.getStream();
при записи вызывается fs.write('text');
При указанном способе параллельной записи в файл «каши» не будет и в .NET, т.к. все сообщения равной длины. Когда два потока одновременно дозаписывают данные в файл, данные будут просто записаны в один и тот же участок файла. Т.е. один поток перезапишет данные другого потока.

Можете попробовать посчитать общее количество записанных строк в файле. Если Node.JS выполняет какую-то I/O-синхронизацию, то 10 потоков, записывающих по 1000 строк, дадут ровно 10000 строк в файле. В противном случае строк будет меньше.

Или попробуйте в разных потоках писать сообщения разной длины.
Спасибо за совет, ща опробуем
Проверил: количество записанных строк равняется 1000 * количество потоков. Нода молодец, отличная синхронизация на уровне I\O.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории