@Fox Привет.Я описывал задачу в этой теме https://community.bablosoft.com/topic/27417/вызов-многопоточной-функции
Дело в том,что я не могу вообще никак перевести свой скрипт на многопоток,у меня тупо,что в вызове функции в многопоток,что просто обычный многопоток,выполняет свою работу с данными по очереди,а не одновременно.И это очень сильно бьет по времени,а нужна именно скорость обработки.Все уже готово и скрипт рабочий полностью,но скорость обработки заставила воспользоваться многопотоком.Ранее,подобных проблем не замечал,а сейчас элементарную задачу не могу уже несколько дней решить.
Скрипт очень простой и работает без браузера вообще,в скрипте используется только одно взаимодействие с гет запросом.Пример скрипта я приложил в этой теме(но без запросов),он точно почти такой же,как и основа.
Логика такова:
1)Запускается скрипт (без всяких ресурсов изначально и данных) и создаются два ресурса.
2)Делается запрос на сайт,который обрабатывается в отдельной функции,т.е. обрабатывает полученные строки и записывает в ресурс.
3)Вызывается функция в несколько потоков,которая работает (должна работать) с каждой строкой из созданного ранее ресурса(уникальной)в отдельном потоке.Данные обрабатываются и записываются во второй ранее созданный ресурс.
4)Как только данные обработаны,ресурс переводится в список и список записывается в файл.Более ничего не делается.
-Сперва я думал,что проблема в создаваемых в ходе работы ресурсах,но нет.Создавал изначально ресурсы и то же самое было.
-Потом пробовал брать из файлов значения\потом создавать файлы по ходу и из них брать данные\сохранять напрямую пытался и.т.д
-Возможно думал стоят какие то ограничения из за слабого пк с 4 гб оперативы и взял сервер с 64 гб,но как обрабатывалась строка за 5 минут на моем пк,так же по скорости и на серваке.Ладно, с этим я уже ничего не поделаю из за регулярок в проекте,согласен.Но вот перевести на поток и хотя бы по 10 строк одновременно обрабатывать,очень бы помогло.А сейчас в любом случае,у меня,сколько бы потоков не выставил - работает все равно как один,просто по очереди разный поток берет свои данные(
BAS_API в Node js
-
Асинхронный код в node js. BAS_API не выполняется. Отдельно проверял, работает, а здесь нет.
all_ws[ws].on('message', function incoming(data) { if (data != 3) { var array = data.match(/([|{).*(]|})/g)[0]; var msg = JSON.parse(array); if (msg[0] == 'message') { if (msg[1].user_login === "ara") { switch (msg[1].message) { case "up": BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(1))"); break; case "down": BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(-1))"); break; default: } } else { } } } }); -
@vanarok said in BAS_API в Node js:
Асинхронный код в node js. BAS_API не выполняется. Отдельно проверял, работает, а здесь нет.
Так и есть, если не оборачивать все в промис и не ждать выполения через await, то функции БАС в таком коде не сработают.
-
@vanarok said in BAS_API в Node js:
@UserTrue пытался с await , но выдает ошибку синтаксиса
С await будет работать. Скорее всего вы неправильно его добавили
https://community.bablosoft.com/topic/4450/websocket-на-node-js/6 -
switch (data.message) { case "plus": await(new Promise((resolve, reject) => { BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(1))"); resolve() })); break; case "minus": await(new Promise((resolve, reject) => { BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(-1))"); resolve() })); break; default: } } else { }пробовал так: синхронный код в асинхронном, такое вообще реально?
-
@vanarok said in BAS_API в Node js:
switch (data.message) { case "plus": await(new Promise((resolve, reject) => { BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(1))"); resolve() })); break; case "minus": await(new Promise((resolve, reject) => { BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(-1))"); resolve() })); break; default: } } else { }пробовал так: синхронный код в асинхронном, такое вообще реально?
Выложите весь код, а лучше тестовый проект, так будет просто быстрее
-
WebSocket = require('socket.io-client'); var ws = "ws" + [[CHILD]]; var SocksProxyAgent = require('https-proxy-agent'); var endpoint = 'wss://test..ru/'; var options = { host: [[PROXY]].split(":")[0], port: [[PROXY]].split(":")[1], protocol: 'http', transports: ['websocket'], } var agent = new SocksProxyAgent(options); all_ws[ws] = new WebSocket(endpoint, { agent: agent }); all_ws[ws].on('connect', () => { all_ws[ws].on('message', (data) => { if (data.user_login === "User") { switch (data.message) { case "plus": await(new Promise((resolve, reject) => { BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(1))"); resolve() })); break; case "minus": await(new Promise((resolve, reject) => { BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(-1))"); resolve() })); break; default: } } else { } }); });тестовый не получится, у него много зависимостей, проще костыль сделать, чем этим заниматься
-
@vanarok said in BAS_API в Node js:
@Fox
тестовый не получится, у него много зависимостей, проще костыль сделать, чем этим заниматьсяПопробуй вот так:
await(new Promise((resolve, reject) => { WebSocket = require('socket.io-client'); var ws = "ws" + [[CHILD]]; var SocksProxyAgent = require('https-proxy-agent'); var endpoint = 'wss://test..ru/'; var options = { host: [[PROXY]].split(":")[0], port: [[PROXY]].split(":")[1], protocol: 'http', transports: ['websocket'], } var agent = new SocksProxyAgent(options); all_ws[ws] = new WebSocket(endpoint, { agent: agent }); all_ws[ws].on('connect', () => { all_ws[ws].on('message', (data) => { if (data.user_login === "User") { switch (data.message) { case "plus": BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(1))"); resolve() case "minus": BAS_API("PSet(\"basglobal\", \"MESSAGE_QUEUE\", parseInt(JSON.parse(P(\"basglobal\", \"MESSAGE_QUEUE\") || \"0\")) + parseInt(-1))"); resolve() default: } } }); }); })); -
@vanarok said in BAS_API в Node js:
Я так понимаю тут никак не выкрутится без завершения всего кода node js.
Код node может работать асинхронно, но на сколько я помню он не может асинхронно работать с BAS (запускать функции, изменять переменные при завершённом действии node js)
-
@dzxt said in BAS_API в Node js:
//функция для установки глобальной переменной типа string из ноды function PSet_string(name,value){ let script = (`PSet(\"basglobal\", \"${name}\", JSON.stringify(\"${value}\"))`); BAS_API(script) } //use PSet_string('NAME','any string')Это вы к чему?