@Koul92 it the connection from ip to bas servers, something important going blocking connect. admin has been alerted but unsure if they fix it try vpn connect
Параллельная работа puppeteer-with-fingerprints?
-
@DevBox said in Параллельная работа puppeteer-with-fingerprints?:
нет смысла для каждого процесса заново инициализировать клиент БАС, достаточно запустить его один раз, а уже потом плодить процессы.
Я по поводу этого, немного поковырялся в репах puppeteer-with-fingerprints, получается что при:
const { plugin } = require('puppeteer-with-fingerprints');Как раз тот самый клиент стартует?
-
@DevBox вы можете посмотреть тикеты в репозиториях (в том числе закрытые), там подобные вопросы уже обсуждались. На данный момент движок в плагинах устроен так, что вы можете использовать сколько угодно экземпляров браузера асинхронно через промисы и любым другим образом, но тут есть ограничение - параллельные запросы будут частично синхронизироваться между собой, это сделано специально, чтобы избежать кучи других возможных проблем, вроде race condition и так далее. Сам запуск браузера тоже будет синхронизирован, под капотом они будут запускаться последовательно, но дальше вы можете спокойно работать с ними так, как вам угодно.
Если такой вариант не устраивает, вы можете клонировать папку с движком и любым способом (например через несколько процессов) использовать разные папки (см. метод
setWorkingFolder), тогда процесс запуска браузеров и другие специфичные для плагина действия будут выполняться быстрее, но и тут есть минус - лишний движок будет занимать место на диске.Так же обратите внимание на примеры в папке
examplesв каждом репозитории, надеюсь эта информация сможет вам помочь. -
Я сейчас использую метод из examples, а именно: multithreading.js через какое-то время вываливаются ошибки:
UNCAUGHT EXCEPTION: Lock is not acquired/owned by you Error: Lock is not acquired/owned by you at C:\Users\Administrator\Develope\PROC\node_modules\proper-lockfile\lib\lockfile.js:285:43 at LOOP (node:fs:2824:14) at process.processTicksAndRejections (node:internal/process/task_queues:77:11)Всего 10 потоков :(( посоветуйте что делать?
-
@DevBox попробуйте использовать разные папки для потоков, ещё для безопасности можно синхронизировать полностью участок
fetch+launch, например, с помощью этого пакета - https://www.npmjs.com/package/async-lock. -
@DevBox said in Параллельная работа puppeteer-with-fingerprints?:
К чему вы пришли, как лучше запускать параллельно?
BAS стартует, запускает сторонний скрипт, которые генерит для него задания. Далее BAS обрабатывает задания и запускает другой скрипт с параметрами запущенных браузеров(remote-debugging-port).
Последний скрипт делает всю работу по управлению браузерами, логикой, etc.
-
С одним вроде справляешься, новое вылезает 🤦
UNCAUGHT EXCEPTION: read ECONNRESET Error: read ECONNRESET at TCP.onStreamRead (node:internal/stream_base_commons:217:20)Кладёт всё приложение вне зависимости сколько там у тебя потоков и сколько папок :(( пока не нажмёшь ctrl+c
-
@DevBox есть такое решение, хоть и не идеальное:
https://github.com/CheshireCaat/browser-with-fingerprints/issues/13#issuecomment-1793508120
-
Вот где-то тут жёстко виснет, условно навсегда )
-------------------------------- 2024-05-20T12:55:05.768Z: read ECONNRESET Error: read ECONNRESET at TCP.onStreamRead (node:internal/stream_base_commons:218:20) -------------------------------- 2024-05-20T13:05:35.377Z: write ECONNABORTED Error: write ECONNABORTED at afterWriteDispatched (node:internal/stream_base_commons:161:15) at writeGeneric (node:internal/stream_base_commons:152:3) at Socket._writeGeneric (node:net:953:11) at Socket._write (node:net:965:8) at writeOrBuffer (node:internal/streams/writable:564:12) at _write (node:internal/streams/writable:493:10) at Writable.write (node:internal/streams/writable:502:10) at Socket.<anonymous> (C:\Users\Administrator\Develope\PROC\node_modules\browser-with-fingerprints\src\plugin\connector\server\index.js:18:18) at Socket.emit (node:events:520:28) at addChunk (node:internal/streams/readable:559:12) -
@UserTrue Я сам сокет не создаю :\ это где-то внутри
node_modules\browser-with-fingerprints\src\plugin\connector\server\index.js:18:18
Т.е. скрипт работает, тупо встаёт, допустим через час я к монитору подхожу, вижу что висит, шлю ему SIGKILL (ctrl + c)
Он вываливает ошибку:-------------------------------- 2024-05-20T20:02:56.118Z: write ECONNABORTED Error: write ECONNABORTED at afterWriteDispatched (node:internal/stream_base_commons:161:15) at writeGeneric (node:internal/stream_base_commons:152:3) at Socket._writeGeneric (node:net:953:11) at Socket._write (node:net:965:8) at writeOrBuffer (node:internal/streams/writable:564:12) at _write (node:internal/streams/writable:493:10) at Writable.write (node:internal/streams/writable:502:10) at Socket.<anonymous> (C:\Users\Administrator\Develope\PROC\node_modules\browser-with-fingerprints\src\plugin\connector\server\index.js:18:18) at Socket.emit (node:events:520:28) at addChunk (node:internal/streams/readable:559:12) -------------------------------- 2024-05-20T20:03:42.856Z: read ECONNRESET Error: read ECONNRESET at TCP.onStreamRead (node:internal/stream_base_commons:218:20)И самое интересное, продолжает дальше работать как ни в чём не бывало )))
Т.е. там где-то внутри соке ждёт без какого-либо таймаута, хрен бы с ним вывалил бы какю-нибудь ошибку, я бы её обработал и пошёл он дальше гулять, так нет, он просто встаёт :(
И это такие свистопляски на AMD EPYC 7351P 16-Core Processor с оперативкой в 256 гиг, я бы ещё понял, если бы я на древнем селероне запускал и он бы так выпендривался. но нет, вполне сносный процессор, чистого chromium он может держать примерно 50-56 потоков. -
@DevBox посмотрю, когда буду обновлять движок у плагинов - не могу сказать причину (сервер всегда стартует на рандомном свободном порту), почему рвется соединения, но постараюсь повторить.
Пока попробуйте это - https://stackoverflow.com/questions/71980181/nodejs-uncaught-econnaborted-socket-exception.
Так же можете до обновления добавить error handling сюда (прямо руками в node_modules), возможно поможет:
-
@DevBox said in Параллельная работа puppeteer-with-fingerprints?:
Т.е. скрипт работает, тупо встаёт
Я когда-то давно смотрел как работает что внутри, если не ошибаюсь, то сделано так, что при наличии любых ошибок посланной команды, скрипт будет висеть вечно. Не проверяется ничего и нигде. Тестов толком тоже нет.
Также есть библиотека на python для удаленного вызова функций из BAS, там сделано также. Офигел в свое время переделывать.
Было даже так, что коннектишься к браузеру, убиваешь браузер из консоли, а скрипт как висел, так и будет висеть, потому что внутри библиотеки архитектурная ошибка логики работы с websocket между скриптом и BAS.
-
@Oyasumi-Punpun , спасибо, попробую