Не одновременный запуск потоков.

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
161
Реакции
128
Баллы
43
Подскажите пожалуйста как можно реализовать многопоточный проект таким образом чтобы потоки запускались не все сразу,а допустим каждый новый поток создавался через 10 секунд. То есть я запускаю проект в 5 потоков. Первый поток ушел выполнять шаблон,ровно через 10 секунд стартует второй поток,еще через 10 третий и так пока все не стартанут. Далее шаблон выполнился дождавшись завершения всех потоков и пошел запускаться по новой с теми же задержками.
 
Подскажите пожалуйста как можно реализовать многопоточный проект таким образом чтобы потоки запускались не все сразу,а допустим каждый новый поток создавался через 10 секунд. То есть я запускаю проект в 5 потоков. Первый поток ушел выполнять шаблон,ровно через 10 секунд стартует второй поток,еще через 10 третий и так пока все не стартанут. Далее шаблон выполнился дождавшись завершения всех потоков и пошел запускаться по новой с теми же задержками.
самое простое, это можно в начале шаблона выставить рандомную паузу в интервале например от 0 до 10 сек.
не совсем то, но все же..
 
  • Спасибо
Реакции: Vvvika88 и ShikoFess
самое простое, это можно в начале шаблона выставить рандомную паузу в интервале например от 0 до 10 сек.
не совсем то, но все же..
Как вариант конечно,но все равно косяки всплывут. Просто сервис с которого я работаю делает так: если аккаунт логинится в одном инстансе инстансе,то при попытке залогинится в это же время со второго(третьего,пятого,десятого) аккаунта на них выдаст что логин не правильный. Залогинится получится со второго,только после того как залогинится предыдущий. Поэтому и нужно чтобы потоки запускались не дновременно,а через небольшой промежуток времени.
 
Как вариант конечно,но все равно косяки всплывут. Просто сервис с которого я работаю делает так: если аккаунт логинится в одном инстансе инстансе,то при попытке залогинится в это же время со второго(третьего,пятого,десятого) аккаунта на них выдаст что логин не правильный. Залогинится получится со второго,только после того как залогинится предыдущий. Поэтому и нужно чтобы потоки запускались не дновременно,а через небольшой промежуток времени.
тогда можно попробовать работать с добавлением потоков, как только первый акк залогинился, он добавляет еще один поток (выполнение) кодом:
Код:
Развернуть Свернуть Копировать
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
после этого включается в работу следующий поток, логинится и добавляется еще один поток и т.д..
тоже не идеальный вариант, но как минимум потоки запустятся четко последовательно, по очереди..
 
Создаете файл или глобальную переменную с текущей датой в unixTime формате (файл проще, а глобалка не будет насиловать диск).
При старте потока получаем сохраненное время, увеличиваем на 10 секунд и кладем обратно в файл. Далее сравниваем текущее время (получаем в том же формате) с нашей переменной и до того как не сравняется - не продолжаем.
Таким образом, при старте каждого следующего потока время в файле будет увеличиваться и потоки будут начинать выполнение с задержкой.

Достаточно просто.
 
Спасибо за ответы попробую реализовать)
 
тогда можно попробовать работать с добавлением потоков, как только первый акк залогинился, он добавляет еще один поток (выполнение) кодом:
Код:
Развернуть Свернуть Копировать
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
после этого включается в работу следующий поток, логинится и добавляется еще один поток и т.д..
тоже не идеальный вариант, но как минимум потоки запустятся четко последовательно, по очереди..
А можно как то получить количество потоков текущего проекта?
 
  • Спасибо
Реакции: ТРОН
тогда можно попробовать работать с добавлением потоков, как только первый акк залогинился, он добавляет еще один поток (выполнение) кодом:
Код:
Развернуть Свернуть Копировать
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
после этого включается в работу следующий поток, логинится и добавляется еще один поток и т.д..
тоже не идеальный вариант, но как минимум потоки запустятся четко последовательно, по очереди..
А как ограничить в этом коде колличество потоков? А то у меня так будут потоки до бесконечности создаваться пока комп не взорвется) Допустим ограничить до 5 потоков максимум,если больше 5 то не будет создавать.
 
Создаете файл или глобальную переменную с текущей датой в unixTime формате (файл проще, а глобалка не будет насиловать диск).
При старте потока получаем сохраненное время, увеличиваем на 10 секунд и кладем обратно в файл. Далее сравниваем текущее время (получаем в том же формате) с нашей переменной и до того как не сравняется - не продолжаем.
Таким образом, при старте каждого следующего потока время в файле будет увеличиваться и потоки будут начинать выполнение с задержкой.

Достаточно просто.
К сожалению этот способ мне не подойдет. Сделал как вы посоветовали,но есть загвоздка. У меня проект в 5 потоков работает но выполняется 20 раз потом переходит ко 2 заданию и смене прокси,а потом по новому кругу. Ваш способ отлично бы работал если бы я выполнял проект в 5 потоков и 5 раз. Но с 20 разами такое не сработает в 5 потоков. Потому что как только шаблон прыгнет на выполнение с 6 по 10 раз,нынешнее unixTime будет уже далеко за пределами 10 секунд и по факту с 6 по 10 раз и далее с 11 по 15 и с 16 по 20 будут выполнятся одновременно.
 
А кто мешает ввести дополнительный счетчик и не допускать превышения определенных значений?
Как вы себе это представляете? превышения каких значений? 20 выполнений настроены в заданиях зенопостера(уменьшить до 5 не смогу ибо мне надо делать не меньше 20),потом переход на следующий шаблон. Потоков в которых отрабатывает шаблон максимум 5 могу поставить.
 
Вот и считайте выполнения. По достижении счетчика 20-ти выполнений обнуляйте переменную и останавливайте шаблон.
 
Вот и считайте выполнения. По достижении счетчика 20-ти выполнений обнуляйте переменную и останавливайте шаблон.
Я же написал что так делать нельзя. Вот сами посудите. Запускает 5 потоков по очереди накидывая на второй и последующий до пятого +10 секунд. Теперь шаблон выполняется эти 5 потоков в среднем 3 минуты. Потом идет выполнение с 6 по 10 и там опять берутся освобожденные 5 потоков,но теперь все они запустятся одновременно потому как глобальная переменная юникс тайм уже сильно устареет и все следующие 5 потоков пройдут проверку при сравнение нынешней переменной юникстайм с глобальной юникс тайм. И так до 20 выполнений с 6 по 20 будут запускаться в 5 потоков одновременно. И только когда шаблон выполнит эти 20 раз,пройдет цикл остальных включенных в задания щаблонов и вернется опять к нужному,только тогда глобальная переменная юникс тайм спарсится по новой. Потому как в самом шаблоне спарсить глобальную переменную нельзя,ибо каждый поток будет ее перезаписывать. В связи с этим парсин глобаьной юникс тайм вынесен в отдельный проект и добавлен в задания.
 
Я же написал что так делать нельзя. Вот сами посудите. Запускает 5 потоков по очереди накидывая на второй и последующий до пятого +10 секунд. Теперь шаблон выполняется в эти 5 потоков в среднем 3 минуты. Потом идет выполнение с 6 по 10 и там опять берутся освобожденные 5 потоков,но все они запустятся одновременно потому как глабальная переменная юникс тайм уже сильно устареет и все следующие 5 потоков пройдут проверку при сравнение нынешней переменной юникстайм с глобальной юникс тайм.
Глобальная переменная потому и называется глобальной, что она одна на все потоки и шаблоны.
 
Странно что в зеннопостере нет эллементарной настройки задержки старта между потоками.
 
Глобальная переменная потому и называется глобальной, что она одна на все потоки и шаблоны.
Спасибо, я знаю. Это к моему вопросу не относится и я в сообщении выше как раз это и имею ввиду.
 
А как ограничить в этом коде колличество потоков? А то у меня так будут потоки до бесконечности создаваться пока комп не взорвется) Допустим ограничить до 5 потоков максимум,если больше 5 то не будет создавать.
можно выставить проекту максимальное кол-во потоков 5 заранее..
будут добавлятся попытки (потоки) и выше 5 потоков уже не прыгнет,
только кол-во выполнений будет расти, а потоки будут фиксированы цифрой 5..
 
  • Спасибо
Реакции: kosmix
тогда можно попробовать работать с добавлением потоков, как только первый акк залогинился, он добавляет еще один поток (выполнение) кодом:
Код:
Развернуть Свернуть Копировать
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
после этого включается в работу следующий поток, логинится и добавляется еще один поток и т.д..
тоже не идеальный вариант, но как минимум потоки запустятся четко последовательно, по очереди..
А вы уверены что этот код имеено потоки прибавляет на 1? Не попытки ли? Выглядит будто добавляет попытки,а не потоки.
 
А вы уверены что этот код имеено потоки прибавляет на 1? Не попытки ли? Выглядит будто добавляет попытки,а не потоки.
да, попытки, но при заранее установленом в настройках кол-ве потоков, это равносильно увеличению потоков..
 
  • Спасибо
Реакции: zortexx
да, попытки, но при заранее установленом в настройках кол-ве потоков, это равносильно увеличению потоков..
Так получится с этой окмандой мой щаб будет работать пока его не выключить верно? А как тогда сделать,чтобы после 20 выполнений шаба он останавливался?
 
Так получится с этой окмандой мой щаб будет работать пока его не выключить верно? А как тогда сделать,чтобы после 20 выполнений шаба он останавливался?
после успешного выполнения шаба (в конце шаба) писать в спец. список (файл) строку и в начале шаба проверять кол-во строк в списке, если больше 20, то выполнять код:
Код:
Развернуть Свернуть Копировать
var id = Guid.Parse(project.TaskId);
ZennoPoster.SetTries(id, 0);
или
Код:
Развернуть Свернуть Копировать
ZennoPoster.StopTask(Guid.Parse(project.TaskId));
 
  • Спасибо
Реакции: ShikoFess
после успешного выполнения шаба (в конце шаба) писать в спец. список (файл) строку и в начале шаба проверять кол-во строк в списке, если больше 20, то выполнять код:
Код:
Развернуть Свернуть Копировать
var id = Guid.Parse(project.TaskId);
ZennoPoster.SetTries(id, 0);
или
Код:
Развернуть Свернуть Копировать
ZennoPoster.StopTask(Guid.Parse(project.TaskId));
Спасибо буду пробовать.
 
Решение через Глобальную переменную.

В начало проекта (первым кубиком) добавить кубик C# с кодом
C#:
Развернуть Свернуть Копировать
int timeOut = 10; // таймаут, сек
lock (SyncObject) {
    try {
        var tickCount = project.GlobalVariables["MyNameSpace", "TickCount"];
        if (tickCount.Value.ToString() == string.Empty) {
            project.GlobalVariables.SetVariable("MyNameSpace", "TickCount", Environment.TickCount);
            return "ok";
        }
        if (tickCount.Value + timeOut * 1000 > Environment.TickCount)
            Thread.Sleep(timeOut * 1000);
        project.GlobalVariables.SetVariable("MyNameSpace", "TickCount", Environment.TickCount);
    }
    catch (KeyNotFoundException ex) {
        project.GlobalVariables.SetVariable("MyNameSpace", "TickCount", Environment.TickCount);
    }
}
 
Решение через Глобальную переменную.

В начало проекта (первым кубиком) добавить кубик C# с кодом
C#:
Развернуть Свернуть Копировать
int timeOut = 10; // таймаут, сек
lock (SyncObject) {
    try {
        var tickCount = project.GlobalVariables["MyNameSpace", "TickCount"];
        if (tickCount.Value.ToString() == string.Empty) {
            project.GlobalVariables.SetVariable("MyNameSpace", "TickCount", Environment.TickCount);
            return "ok";
        }
        if (tickCount.Value + timeOut * 1000 > Environment.TickCount)
            Thread.Sleep(timeOut * 1000);
        project.GlobalVariables.SetVariable("MyNameSpace", "TickCount", Environment.TickCount);
    }
    catch (KeyNotFoundException ex) {
        project.GlobalVariables.SetVariable("MyNameSpace", "TickCount", Environment.TickCount);
    }
}

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

При этом глобальная переменная просто не успевает обновиться. В результате у меня до 8 потоков иногда могут взять из списка прокси один и тот же прокси. Не знаю, как бороться с этой проблемой.
 
  • Спасибо
Реакции: Yo_Moe
Я не пробовал использовать данное решение.
В результате у меня до 8 потоков иногда могут взять из списка прокси один и тот же прокси.
Не знаю, как бороться с этой проблемой.
Так попробуйте...
 
самое простое, это можно в начале шаблона выставить рандомную паузу в интервале например от 0 до 10 сек.
не совсем то, но все же..

Здравствуйте :cw:

Рандомную паузу и потом какой кубик? Чтобы запустился второй поток:dy:

UPD:
Взяла этот кубик:
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);

Всем спасибо!*KISSING*
 
Последнее редактирование:

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)