У меня был очень похожий опыт, но я остановился на другом решении.
Я тоже тестировал скрипт на 8 ядерном 32 гб дедике с широким каналом и там еле еле 10 потоков шло.
Работающими решением оказалось взять 32 ядерный локальный сервер с 64 оперативки, на не очень быстром канале, с сокс5, на нем 100+ потоков запускалось.
Скрипт тот же, никаких оптимизаций не делалось.
Стоит конечно побольше, чем аренда дедика но тут уж зависит от окупаемости твоей темы, стоит ли оно того или нет.
Но соксы могут быть узким местом, по возможности нужно делать свои соксы. Для этого, можно брать дешевые VPS и установить сокс через опенсурсный софт microsocks для линукса (в инете полно инструкций по установке, занимает не более 5 минут вручную, и можно установку через БАС автоматизировать также на случай если нужны сотни соксов).
Переменная времени работы скрипта.
-
В отчёте работы скрипта есть время работы. Можно его вызвать в переменную или лог? Без функции OnApplicationStart и вычитания дат new Date(); ?
-
Захотел реализовать в админке счётчик времени работы каждого потока. Точнее определённой функции у каждого потока.
Поставил перед заходом в цикл нужной мне функции маркер времени:VAR_TM = new Date();А уже при срабатывании условий в функции ставится новый маркер времени и вычитается из старого:
VAR_TM2 = new Date(); VAR_TIME_JOB_0 = ((VAR_TM2) - (VAR_TM));В переменной TIME_JOB_0 получаю миллисекунды прошедшие с одного маркера до другого.
Дак вот из этих миллисекунд надо получить время чч:мм:ссПробывал через функции получить часы, минуты и секунды
VAR_H_JT = (VAR_TIME_JOB_0).getHours(); VAR_M_JT=(VAR_TIME_JOB_0).getMinutes(); VAR_S_JT=(VAR_TIME_JOB_0).getSeconds();Ругается ошибкой : TypeError: Result of expression '(VAR_TIME_JOB_0).getSeconds' [undefined] is not a function
Пробывал перевести полученные миллисекунды в дату и снова получить функцией время..
VAR_TM2 = new Date(); VAR_TIME_JOB_0 = ((VAR_TM2) - (VAR_TM)); VAR_TIME_JOB = new Date(VAR_TIME_JOB_0); VAR_H_JT = (VAR_TIME_JOB).getHours(); VAR_M_JT=(VAR_TIME_JOB).getMinutes(); VAR_S_JT=(VAR_TIME_JOB).getSeconds();Но так как в переменной TIME_JOB теперь дата Thu Jan 01 1970 05:06:17 GMT+0500 (RTZ 4) то функция получает значения 5 часов, 6 минут и 17 секунд. Хотя по факту прошло 337951 миллисекунд, тоесть 5 минут 38 секунд.
Пробовал тупым делением, когда полученные миллисекунды делил на 1000 (для секунд), на 60000 (для минут).. В итоге мог получить значение вида 1 час 70 минут 4200 секунд..
Голова уже не варит, такой простой косяк, а упёрся и не даётся..
-
Через три звезды колена сделал.. Тупо через деление..
VAR_TM2 = new Date(); VAR_TIME_JOB_0 = ((VAR_TM2) - (VAR_TM))/1000; VAR_H_JT = Math.floor((VAR_TIME_JOB_0)/3600) VAR_M_JT = Math.floor(VAR_TIME_JOB_0/60)-((VAR_H_JT)*60) VAR_S_JT = Math.floor(VAR_TIME_JOB_0)-((Math.floor(VAR_TIME_JOB_0/60))*60) -
@Viktor said in Переменная времени работы скрипта.:
@Fox так же пришлось реализовать. Не красиво, но работает. Через математический лес
Согласен. Главное что работает :)
Добавил условие отображение минут, если скрипт работает больше минуты. И часов, если скрипт работает больше часа.VAR_TM2 = new Date(); VAR_TIME_JOB_0 = ((VAR_TM2) - (VAR_TM))/1000; VAR_H_JT = Math.floor((VAR_TIME_JOB_0)/3600) VAR_M_JT = Math.floor(VAR_TIME_JOB_0/60)-((VAR_H_JT)*60) VAR_S_JT = Math.floor(VAR_TIME_JOB_0)-((Math.floor(VAR_TIME_JOB_0/60))*60) if (VAR_TIME_JOB_0 > 0) VAR_TIME_JOB = VAR_S_JT + "с" if (VAR_TIME_JOB_0 > 60) VAR_TIME_JOB = VAR_M_JT + "м " + VAR_S_JT + "с" if (VAR_TIME_JOB_0 > 3600) VAR_TIME_JOB = VAR_H_JT + "ч " + VAR_M_JT + "м " + VAR_S_JT + "с"Можно ещё добавить отображение нуля до 10..Чтобы отображалось 08, а не просто 8.
Но думаю это лишнее.. -
@Viktor Чтобы скрипт отрабатывал раз в сутки есть проще способ, у меня много что на нём основано.
- Ставишь перед циклом временной маркер
VAR_DATE_OLD = new Date()- Потом в цикле Выполнить код
VAR_DATE_NEW = new Date() VAR_DATE = ((VAR_DATE_NEW) - (VAR_DATE_OLD)) / 60000/60000 мне нужны были минуты. Можно было разделить на 3600000 если нужны часы.
3. Далее ставишь IF[[DATE]] > 5Чтобы раз в 5 минут выполнялся IF
4. В этом IF в конце обновляешь временной маркерVAR_DATE_OLD = new Date() -
@pavelbond Для работы со временем теперь есть отдельный модуль "дата и время".
5:24 и вот его хотелось бы в секунды. примерно.
Действие Создать Дату, затем Дату в Миллисекунды ну и раздели полученный результат на 1000.
-
@pavelbond Тема называется "Переменная времени работы скрипта.", причём тут ваш вопрос?
как в басе делить?
Пробовал делать в переменной поставить знак деление( но у вы(

Так бы так хотелось чтоб внутри все системы был конвертер) без костылей так сказать)
Конвертер чего? И про какие костыли идёт речь?
-
@fox
Спасибо огромное, до этого вопроса делал так раньше( но ничего не вышло((
возможно не поставил experssion.
Спасибо тебе огромное за помощь.
Обычно все с начало делаю методом тыка и читаю форум) а потом тока задаю вопросы)
Кстати проценты так же делаются???
От информации и от не привычки голова кругом идет -
@19717 said in Переменная времени работы скрипта.:
@Fox Делаю как написано, выдаёт ошибку в 1 действии если с = new Date() если убираю = new Date() выдаёт ошибку во 2 действии VAR_DATE_OLD
Чегось? Я же выше писал, что сейчас проще использовать модуль "Дата и время"
-
@19717 said in Переменная времени работы скрипта.:
@Fox Уже кучу вариантов испробывал, но что-то не получается. Помогите пожалуйста разобраться. Вот 1568376464507-1568060461320-project-новый.xml
а что вы пытаетесь сделать?
-
@19717 said in Переменная времени работы скрипта.:
@Fox Вообще то хочу сделать, чтобы через определённое время скачивался файл, то есть выставить 10 минут и чтобы он через каждые 10 минут скачивался
установите действие "сон" со значением
1000*60*10. Десять в конце означает минуты