LINUX.ORG.RU

Как реализовать fifo

 


1

2

Решил попробовать worker_threads в ноде, для этого решил написать простое приложение, которое бы получало список страниц и делало их скриншоты.Возникла проблема: в node.js нет аналога питоновских Queue. Я хочу FIFO: ложить список ссылок в очередь и чтобы воркеры их разбирали по одной. Аналога mkfifo в нодадрисне нет, этих петухов все блокирующее пугает. У меня остается только вариант взять и через Redis все сделать…

UPD: нода ожидаемо оказалась гамном, поэтому свою приблуду я сделал на лучшем языке программирования в мире Python. Результаты работы я выложил на своем полупустом github’e. Пожалуйста, если не сложно, поставьте звездочку.

$ pip install websnapshot

$ websnapshot --help                                                                                                    
Usage: websnapshot [OPTIONS]

  capture snapshot of webpage

Options:
  -v, --version                [default: False]
  -i, --input FILENAME         input filename  [default: -]
  -o, --output PATH            snapshot output directory  [default:
                               ./websnapshots]

  -w, --workers INTEGER        number of workers  [default: 10]
  -V, --viewport_size TEXT     viewport size  [default: 1366x768]
  -H, --header TEXT            extra header
  -f, --full_page              full page snapshot  [default: False]
  -q, --quality INTEGER        snapshot quality (1-100)  [default: 85]
  -e, --extension, --ext TEXT  snapshot extension  [default: .png]
  -d, --delay FLOAT            delay after page load in seconds  [default:
                               5.0]

  -t, --timeout FLOAT          maximum navigation timeout in seconds
                               [default: 15.0]

  -l, --log_level TEXT         logging level  [default: warning]
  --help                       Show this message and exit.

# Пример полноразмерного скриншота этой страницы
$ echo 'https://www.linux.org.ru/forum/web-development/15661582' | websnapshot -f

Результат.

★★

Ответ на: комментарий от crutch_master
execSync(`rm -rf "${fifoPath}"; mkfifo "${fifoPath}"`)
      // fs.writeSync почему-то не дожидается пока данные из FIFO будут прочитаны
      const fileHandler = await fs.promises.open(
        fifoPath,
        fs.constants.O_RDWR | fs.constants.O_NONBLOCK
      )
      const fifoStream = new net.Socket({ fd: fileHandler.fd, readable: false })
      for (const url of urls) {
        console.log('write fifo')
        if (!fifoStream.write(url)) {
          await once(fifoStream, 'drain')
        }
      }
      await fileHandler.close()

Worker:


console.log('read fifo')
const data = fs.readFileSync(fifoPath)
write fifo
write fifo
read fifo
read fifo

Тащем-та это фейл (толи сани не едут, толи я…)

tz4678 ★★ ()

приложение, которое бы получало список страниц и делало их скриншоты

Redis

Недостаточно надежно, надо Oracle. Кажется, так в ненодадрисне решаются проблемы? %)

Nervous ★★★★★ ()
//main.js
var log = console.log;
var { Worker } = require("worker_threads");

var thread = function(workerData) {
    return new Promise((ok, fail) => {
        var w = new Worker("./worker.js", {workerData});
        w.on("message", ok);
        w.on("error", fail);
        w.on("exit", (c)=>{
            if (c !== 0) fail(new Error("Worker fail with code "+c));
        });
    });
}

var data = [];
for (var i = 0; i < 100; i++) data.push(i);

var run = async function() {
    data.forEach(async (v)=>{
        var res = await thread(v);
        log(res);
    });
}

//worker.js
var { workerData, parentPort } = require("worker_threads");

var time = Math.floor(Math.random() * 1000) + 500;
var thread = workerData;

setTimeout(()=>parentPort.postMessage({thread, time}), time);
# launch
$ UV_THREADPOOL_SIZE=100 node main.js
...
{ thread: 75, time: 1186 }
{ thread: 97, time: 1114 }
{ thread: 28, time: 1251 }
{ thread: 23, time: 1276 }
{ thread: 56, time: 1428 }
{ thread: 94, time: 1425 }
crutch_master ★★★★★ ()

Предлагаю обернуть в промис, сделать синглтон со счётчиком и когда из fifo забирают, сравнивать номер ссылки со счётчиком и если соответствует порядку, забирать, иначе ждать.

Идеально для асинхронного гибкого и мощного языка, я считаю.

PS. А почему ТАКУЮ задачу не на брейнфаке? (я к тому, почему для ТАКОЙ задачи не взять что-то синхронное)

Shadow ★★★★★ ()
Ответ на: комментарий от crutch_master

так у тебя другая проблема, ты 100500 процессов создаешь, которые у нодопетухов тредами обозваны.

Короче я на питоне свою либу написал https://pypi.org/project/websnapshot/ https://github.com/tz4678/websnapshot

Take Snapshot of WebPage

# install
$ pip install websnapshot

# better install
$ pipx install websnapshot

# from stdout
$ echo 'https://stackoverflow.com/' | websnapshot

# text file with urls
$ websnapshot -i urls.txt

# usage
$ websnapshot --help

Она самая лучшая и сексуальная и в ней всего 105 CLOC

Нодовские треды оказались на проверку неюзабильной дрисней

tz4678 ★★ ()
Последнее исправление: tz4678 (всего исправлений: 1)
Ответ на: комментарий от tz4678

так у тебя другая проблема, ты 100500 процессов создаешь

Не больше, чем значение UV_THREADPOOL_SIZE. Тредпул чисто на ноде делается элементарно, но мне лень распинаться перед таким лузером.

Нодовские треды оказались на проверку неюзабильной дрисней

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

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от peregrine

ну так-то да много. меня больше всего разочаровало, что в node.js по-ходу нельщя организовать коммуникацию через fifo либо named pipes. пишущий stream не ждет пока из файла прочитают данные

tz4678 ★★ ()
Ответ на: комментарий от tz4678

ну так-то да много. меня больше всего разочаровало, что в node.js по-ходу нельщя организовать коммуникацию через fifo либо named pipes.

Так то и другое неродные для винды технологии, а нода выросла как раз из неё.

torvn77 ★★★★★ ()
Ответ на: комментарий от torvn77

4.2 в винде со времен nt, есть и то и другое. Дело скорее в том что нода на асинхронное выполнение рассчитана, без блокировок, а пайпы и очереди они как бы про них

cobold ★★★ ()
Ответ на: комментарий от tz4678

Реализуй мой скрипт
мой скрипт

В каком месте он твой, эникей?

Реализуй

Ты забыл сказать «пожалуйста».

потом поговорим

О чем с тобой можно разговаривать, запартыш? :)

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от crutch_master

хотя там и thread workers не нужны cpu bound то нет, но неоспоримый факт в том, что нода каличная: в ней нет такой богатой встроенной библиотеки как в python, нет очередей, нет нормальных тредов, где внутри треда доступны все переменные из родительской области видимости. понятно почему в node.js сделали такие уродливые треды: эту библиотеку писала тупая баба, которой мозгов бы никогда нк хватидо реализовать все по-человечески, она просто избегала проблем с синхронизацией потоков

tz4678 ★★ ()
Ответ на: комментарий от tz4678

понятно почему в node.js сделали такие уродливые треды

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

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

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

crutch_master ★★★★★ ()
Ответ на: комментарий от tz4678

Так твой скрипт и есть петушиная возьня, и повадки как у петушка. Что ты и кому тут пытаешься доказать то? Не осилил на ноде фифу написать, обосрался, побежал в уютненький насиженный питон, почему твой анскилл в жс, это проблемы ноды, а не твои?

anonymous ()