У меня был очень похожий опыт, но я остановился на другом решении.
Я тоже тестировал скрипт на 8 ядерном 32 гб дедике с широким каналом и там еле еле 10 потоков шло.
Работающими решением оказалось взять 32 ядерный локальный сервер с 64 оперативки, на не очень быстром канале, с сокс5, на нем 100+ потоков запускалось.
Скрипт тот же, никаких оптимизаций не делалось.
Стоит конечно побольше, чем аренда дедика но тут уж зависит от окупаемости твоей темы, стоит ли оно того или нет.
Но соксы могут быть узким местом, по возможности нужно делать свои соксы. Для этого, можно брать дешевые VPS и установить сокс через опенсурсный софт microsocks для линукса (в инете полно инструкций по установке, занимает не более 5 минут вручную, и можно установку через БАС автоматизировать также на случай если нужны сотни соксов).
Действия при удаче или неудаче завершении потока (скрипта)
-
Заметил в api эти функции:
_on_fail(callback) _on_success(callback)Можно ли вызывать их в скрипте для отработки необходимых действий в случае неудачи или удачи?
Планируется ли добавление функций OnApplicationEnd (как тут давно просили), OnSuccess, OnFail для потока?
Были бы очень полезные функции.P.S. Вместо OnFail сейчас есть замечательная возможность игнорирования ошибок и самостоятельная их обработка, но все же)
-
@MAKAR
А как должна работать OnApplicationEnd ?
Может поможет реализация запуска функции в несколько потоков ? (в данном случае в 1 поток). Тоесть основной блок выполняет действия в несколько потоков, создаете функцию, обзываете ее OnApplicationEnd (для удобства) и вызываете ее в конце в 1 поток.
OnSuccess обрабатывается также как сейчас Вы обрабатываете OnFail.if ![[WAS_ERROR]] ... -
@xclsv То, что они обрабатываются, очевидно. Функция OnApplicationEnd могла бы следить за количеством работающих потоков, когда все они так или иначе завершены, создавала бы новый поток, выполняющий функцию завершения. Например, завершить сторонние программы или выключить ПК. Но без этой функции я не знаю, как гарантированно отследить, в какой момент все потоки завершили работу и пора вызывать завершающую функцию. При успешном завершении можно устанавливать флаги завершения (глобальные переменные), а если произойдет ошибка в браузере, будет таймаут соединения и поток завершится ошибкой,при этом перезапускать поток в проекте не нужно, как установить флаг?
Есть ли функция, возвращающая количество работающих потоков? Тогда можно было бы выделить один управляющий поток, следящий за состоянием рабочих и в нужном месте вызывал функции, которые не вызывает рабочий поток. -
@MAKAR said in Действия при удаче или неудаче завершении потока (скрипта):
@xclsv Функция OnApplicationEnd могла бы следить за количеством работающих потоков, когда все они так или иначе завершены, создавала бы новый поток, выполняющий функцию завершения. Например, завершить сторонние программы или выключить ПК. Но без этой функции я не знаю, как гарантированно отследить, в какой момент все потоки завершили работу и пора вызывать завершающую функцию. При успешном завершении можно устанавливать флаги завершения (глобальные переменные), а если произойдет ошибка в браузере, будет таймаут соединения и поток завершится ошибкой,при этом перезапускать поток в проекте не нужно, как установить флаг?
Есть ли функция, возвращающая количество работающих потоков? Тогда можно было бы выделить один управляющий поток, следящий за состоянием рабочих и в нужном месте вызывал функции, которые не вызывает рабочий поток.Не нужно никаких флагов и функций следящих за работой потоков. Просто делаете многопоточную функцию, а сразу же за ней однопоточную (Ваш OnApplicationEnd ). После выполнения первой многопоточной выполнится вторая однопоточная. Вот и всё решение.
-
@DrPrime Как сделать функцию, которая обработается при ручной остановке приложения. К примеру у меня программа работает через тор, если не дождавшись окончания работы программы, сделать её остановку через интерфейс, то потоки тор останутся висеть. а хотелось бы их завершать. с CloseApplication() не разобрался как можно реализовать
-
@graf said in Действия при удаче или неудаче завершении потока (скрипта):
@DrPrime Как сделать функцию, которая обработается при ручной остановке приложения. К примеру у меня программа работает через тор, если не дождавшись окончания работы программы, сделать её остановку через интерфейс, то потоки тор останутся висеть. а хотелось бы их завершать. с CloseApplication() не разобрался как можно реализовать
Повесить обработчик на ручную остановку скрипта можно только в веб интерфейсе