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

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
Подскажите пожалуйста как можно реализовать многопоточный проект таким образом чтобы потоки запускались не все сразу,а допустим каждый новый поток создавался через 10 секунд. То есть я запускаю проект в 5 потоков. Первый поток ушел выполнять шаблон,ровно через 10 секунд стартует второй поток,еще через 10 третий и так пока все не стартанут. Далее шаблон выполнился дождавшись завершения всех потоков и пошел запускаться по новой с теми же задержками.
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 438
Благодарностей
9 135
Баллы
113
Подскажите пожалуйста как можно реализовать многопоточный проект таким образом чтобы потоки запускались не все сразу,а допустим каждый новый поток создавался через 10 секунд. То есть я запускаю проект в 5 потоков. Первый поток ушел выполнять шаблон,ровно через 10 секунд стартует второй поток,еще через 10 третий и так пока все не стартанут. Далее шаблон выполнился дождавшись завершения всех потоков и пошел запускаться по новой с теми же задержками.
самое простое, это можно в начале шаблона выставить рандомную паузу в интервале например от 0 до 10 сек.
не совсем то, но все же..
 
  • Спасибо
Реакции: Vvvika88 и ShikoFess

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
самое простое, это можно в начале шаблона выставить рандомную паузу в интервале например от 0 до 10 сек.
не совсем то, но все же..
Как вариант конечно,но все равно косяки всплывут. Просто сервис с которого я работаю делает так: если аккаунт логинится в одном инстансе инстансе,то при попытке залогинится в это же время со второго(третьего,пятого,десятого) аккаунта на них выдаст что логин не правильный. Залогинится получится со второго,только после того как залогинится предыдущий. Поэтому и нужно чтобы потоки запускались не дновременно,а через небольшой промежуток времени.
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 438
Благодарностей
9 135
Баллы
113
Как вариант конечно,но все равно косяки всплывут. Просто сервис с которого я работаю делает так: если аккаунт логинится в одном инстансе инстансе,то при попытке залогинится в это же время со второго(третьего,пятого,десятого) аккаунта на них выдаст что логин не правильный. Залогинится получится со второго,только после того как залогинится предыдущий. Поэтому и нужно чтобы потоки запускались не дновременно,а через небольшой промежуток времени.
тогда можно попробовать работать с добавлением потоков, как только первый акк залогинился, он добавляет еще один поток (выполнение) кодом:
Код:
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
после этого включается в работу следующий поток, логинится и добавляется еще один поток и т.д..
тоже не идеальный вариант, но как минимум потоки запустятся четко последовательно, по очереди..
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
Создаете файл или глобальную переменную с текущей датой в unixTime формате (файл проще, а глобалка не будет насиловать диск).
При старте потока получаем сохраненное время, увеличиваем на 10 секунд и кладем обратно в файл. Далее сравниваем текущее время (получаем в том же формате) с нашей переменной и до того как не сравняется - не продолжаем.
Таким образом, при старте каждого следующего потока время в файле будет увеличиваться и потоки будут начинать выполнение с задержкой.

Достаточно просто.
 

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
Спасибо за ответы попробую реализовать)
 

ТРОН

Client
Регистрация
31.07.2016
Сообщения
336
Благодарностей
381
Баллы
63
тогда можно попробовать работать с добавлением потоков, как только первый акк залогинился, он добавляет еще один поток (выполнение) кодом:
Код:
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
после этого включается в работу следующий поток, логинится и добавляется еще один поток и т.д..
тоже не идеальный вариант, но как минимум потоки запустятся четко последовательно, по очереди..
А можно как то получить количество потоков текущего проекта?
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 438
Благодарностей
9 135
Баллы
113
  • Спасибо
Реакции: ТРОН

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
тогда можно попробовать работать с добавлением потоков, как только первый акк залогинился, он добавляет еще один поток (выполнение) кодом:
Код:
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
после этого включается в работу следующий поток, логинится и добавляется еще один поток и т.д..
тоже не идеальный вариант, но как минимум потоки запустятся четко последовательно, по очереди..
А как ограничить в этом коде колличество потоков? А то у меня так будут потоки до бесконечности создаваться пока комп не взорвется) Допустим ограничить до 5 потоков максимум,если больше 5 то не будет создавать.
 

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
Создаете файл или глобальную переменную с текущей датой в unixTime формате (файл проще, а глобалка не будет насиловать диск).
При старте потока получаем сохраненное время, увеличиваем на 10 секунд и кладем обратно в файл. Далее сравниваем текущее время (получаем в том же формате) с нашей переменной и до того как не сравняется - не продолжаем.
Таким образом, при старте каждого следующего потока время в файле будет увеличиваться и потоки будут начинать выполнение с задержкой.

Достаточно просто.
К сожалению этот способ мне не подойдет. Сделал как вы посоветовали,но есть загвоздка. У меня проект в 5 потоков работает но выполняется 20 раз потом переходит ко 2 заданию и смене прокси,а потом по новому кругу. Ваш способ отлично бы работал если бы я выполнял проект в 5 потоков и 5 раз. Но с 20 разами такое не сработает в 5 потоков. Потому что как только шаблон прыгнет на выполнение с 6 по 10 раз,нынешнее unixTime будет уже далеко за пределами 10 секунд и по факту с 6 по 10 раз и далее с 11 по 15 и с 16 по 20 будут выполнятся одновременно.
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
А кто мешает ввести дополнительный счетчик и не допускать превышения определенных значений?
 

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
А кто мешает ввести дополнительный счетчик и не допускать превышения определенных значений?
Как вы себе это представляете? превышения каких значений? 20 выполнений настроены в заданиях зенопостера(уменьшить до 5 не смогу ибо мне надо делать не меньше 20),потом переход на следующий шаблон. Потоков в которых отрабатывает шаблон максимум 5 могу поставить.
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 226
Баллы
113
Вот и считайте выполнения. По достижении счетчика 20-ти выполнений обнуляйте переменную и останавливайте шаблон.
 

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
Вот и считайте выполнения. По достижении счетчика 20-ти выполнений обнуляйте переменную и останавливайте шаблон.
Я же написал что так делать нельзя. Вот сами посудите. Запускает 5 потоков по очереди накидывая на второй и последующий до пятого +10 секунд. Теперь шаблон выполняется эти 5 потоков в среднем 3 минуты. Потом идет выполнение с 6 по 10 и там опять берутся освобожденные 5 потоков,но теперь все они запустятся одновременно потому как глобальная переменная юникс тайм уже сильно устареет и все следующие 5 потоков пройдут проверку при сравнение нынешней переменной юникстайм с глобальной юникс тайм. И так до 20 выполнений с 6 по 20 будут запускаться в 5 потоков одновременно. И только когда шаблон выполнит эти 20 раз,пройдет цикл остальных включенных в задания щаблонов и вернется опять к нужному,только тогда глобальная переменная юникс тайм спарсится по новой. Потому как в самом шаблоне спарсить глобальную переменную нельзя,ибо каждый поток будет ее перезаписывать. В связи с этим парсин глобаьной юникс тайм вынесен в отдельный проект и добавлен в задания.
 

ТРОН

Client
Регистрация
31.07.2016
Сообщения
336
Благодарностей
381
Баллы
63
Я же написал что так делать нельзя. Вот сами посудите. Запускает 5 потоков по очереди накидывая на второй и последующий до пятого +10 секунд. Теперь шаблон выполняется в эти 5 потоков в среднем 3 минуты. Потом идет выполнение с 6 по 10 и там опять берутся освобожденные 5 потоков,но все они запустятся одновременно потому как глабальная переменная юникс тайм уже сильно устареет и все следующие 5 потоков пройдут проверку при сравнение нынешней переменной юникстайм с глобальной юникс тайм.
Глобальная переменная потому и называется глобальной, что она одна на все потоки и шаблоны.
 

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
Странно что в зеннопостере нет эллементарной настройки задержки старта между потоками.
 

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
Глобальная переменная потому и называется глобальной, что она одна на все потоки и шаблоны.
Спасибо, я знаю. Это к моему вопросу не относится и я в сообщении выше как раз это и имею ввиду.
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 438
Благодарностей
9 135
Баллы
113
А как ограничить в этом коде колличество потоков? А то у меня так будут потоки до бесконечности создаваться пока комп не взорвется) Допустим ограничить до 5 потоков максимум,если больше 5 то не будет создавать.
можно выставить проекту максимальное кол-во потоков 5 заранее..
будут добавлятся попытки (потоки) и выше 5 потоков уже не прыгнет,
только кол-во выполнений будет расти, а потоки будут фиксированы цифрой 5..
 
  • Спасибо
Реакции: kosmix

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 040
Баллы
113

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
тогда можно попробовать работать с добавлением потоков, как только первый акк залогинился, он добавляет еще один поток (выполнение) кодом:
Код:
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
после этого включается в работу следующий поток, логинится и добавляется еще один поток и т.д..
тоже не идеальный вариант, но как минимум потоки запустятся четко последовательно, по очереди..
А вы уверены что этот код имеено потоки прибавляет на 1? Не попытки ли? Выглядит будто добавляет попытки,а не потоки.
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 438
Благодарностей
9 135
Баллы
113
А вы уверены что этот код имеено потоки прибавляет на 1? Не попытки ли? Выглядит будто добавляет попытки,а не потоки.
да, попытки, но при заранее установленом в настройках кол-ве потоков, это равносильно увеличению потоков..
 
  • Спасибо
Реакции: zortexx

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
да, попытки, но при заранее установленом в настройках кол-ве потоков, это равносильно увеличению потоков..
Так получится с этой окмандой мой щаб будет работать пока его не выключить верно? А как тогда сделать,чтобы после 20 выполнений шаба он останавливался?
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 438
Благодарностей
9 135
Баллы
113
Так получится с этой окмандой мой щаб будет работать пока его не выключить верно? А как тогда сделать,чтобы после 20 выполнений шаба он останавливался?
после успешного выполнения шаба (в конце шаба) писать в спец. список (файл) строку и в начале шаба проверять кол-во строк в списке, если больше 20, то выполнять код:
Код:
var id = Guid.Parse(project.TaskId);
ZennoPoster.SetTries(id, 0);
или
Код:
ZennoPoster.StopTask(Guid.Parse(project.TaskId));
 
  • Спасибо
Реакции: ShikoFess

ShikoFess

Client
Регистрация
21.12.2017
Сообщения
146
Благодарностей
117
Баллы
43
после успешного выполнения шаба (в конце шаба) писать в спец. список (файл) строку и в начале шаба проверять кол-во строк в списке, если больше 20, то выполнять код:
Код:
var id = Guid.Parse(project.TaskId);
ZennoPoster.SetTries(id, 0);
или
Код:
ZennoPoster.StopTask(Guid.Parse(project.TaskId));
Спасибо буду пробовать.
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Решение через Глобальную переменную.

В начало проекта (первым кубиком) добавить кубик 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);
    }
}
 
Регистрация
19.12.2015
Сообщения
288
Благодарностей
36
Баллы
28
Решение через Глобальную переменную.

В начало проекта (первым кубиком) добавить кубик 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

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 371
Баллы
113
Я не пробовал использовать данное решение.
В результате у меня до 8 потоков иногда могут взять из списка прокси один и тот же прокси.
Не знаю, как бороться с этой проблемой.
Так попробуйте...
 

Vvvika88

Client
Регистрация
09.11.2020
Сообщения
38
Благодарностей
12
Баллы
8
самое простое, это можно в начале шаблона выставить рандомную паузу в интервале например от 0 до 10 сек.
не совсем то, но все же..
Здравствуйте :cw:

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

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

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

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