Синхронизация потоков

Sirius123

Client
Регистрация
16.09.2017
Сообщения
51
Благодарностей
17
Баллы
8
Имеется простенький шаблон работы с сайтом, запускается в несколько потоков(до 15 потоков), на одном этапе этого шаблона он делает запрос к сайту, вот задача стоит в том что бы все потоки сделали этот запрос одновременно. Как можно это реализовать ?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 653
Благодарностей
3 439
Баллы
113

izubr

Client
Регистрация
11.05.2011
Сообщения
628
Благодарностей
284
Баллы
63
Можно без C#
Но надо продумать алгоритм. Самое тупое решение, которое придумал за утро, вскользь:
Завести 15 глобальных переменных
P1
P2
...
P15
В нужный момент каждый шаблон выставляет Pn=1
И мониторит сумму всех переменных (P1+P2+..P15)=15
Запуск действия
 
  • Спасибо
Реакции: Sirius123
Регистрация
17.01.2022
Сообщения
110
Благодарностей
31
Баллы
28
Имеется простенький шаблон работы с сайтом, запускается в несколько потоков(до 15 потоков), на одном этапе этого шаблона он делает запрос к сайту, вот задача стоит в том что бы все потоки сделали этот запрос одновременно. Как можно это реализовать ?
задать время для всех одно (если 0:00:00, то..) и тоже и в нужное время продолжить выполнение шаблона? какой то шаблон будет отвечать условно за установку времени (ложит в текстовый файл счетчик типо 1) если есть - то все остальные работают по времени как описал ранее.
 
  • Спасибо
Реакции: Sirius123

profi88

Client
Регистрация
10.09.2018
Сообщения
319
Благодарностей
50
Баллы
28
Можно сделать синхронный старт через «барьер» — поток(ы) готовят запросы, ждут сигнала, по сигналу все одновременно отправляют. В C# это делается очень просто (пример с Manual Reset Event Slim + Task):

var start = new Manual Reset Event Slim(false);
var http = new HttpClient();
var tasks = Enumerable.Range(0, 15).Select(i => Task.Run(async () => {
// подготовка тела/заголовков
start.Wait(); // ждём общего сигнала
var resp = await http.PostAsync(url, content);
return await resp.Content.ReadAsStringAsync();
})).ToArray();

// всё готово — даём сигнал
start.Set();
await Task.WhenAll(tasks);

Альтернативы: CountdownEvent (ждёт пока все будут готовы), Barrier (для циклической синхронизации). Важно: абсолютной «мгновенности» ждать не стоит — сети и ОС вводят задержки. Учитывайте лимиты сервера, добавьте jitter/логирование и обработку ошибок/таймаутов.


Если вы в ZennoPoster — аналогично: подготовьте все «кубики» до точки ожидания и синхронизируйте через общий файл/DB/Redis или через внешнюю C# службу, которая выдаст сигнал.
 

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