Стресс-тестирование с асинхронным вызовом 100 потоков

#c# #.net #multithreading #asynchronous #threadpool

#c# #.net #многопоточность #асинхронный #threadpool

Вопрос:

Я просто хочу вызвать 100 потоков асинхронно с C # (вы можете думать, что в каждом потоке один пользователь), и я хочу получить среднее значение времени сериализации моего кода.Должен ли я использовать пул потоков для этого? Спасибо

Ответ №1:

Я просто хочу вызвать 100 потоков асинхронно

Что вы конкретно имеете в виду?

Если вам нужно выполнить 100 задач асинхронно -ThreadPool — лучшее решение. Вас не волнуют потоки, просто помещайте рабочие элементы в очередь в пул, а операционная система распределяет элементы между доступными потоками. Вы должны понимать, что все ваши 100 задач могут быть обработаны только 3 или 5 (например) потоками.

Если вам нужно создать 100 потоков и делегировать каждую задачу отдельному потоку — ThreadPool не является решением, потому что ThreadPool не создает новые потоки. Вы должны создать их вручную.

 // Create 100 threads
var threads = new List<Thread>(); 
for (int p = 0; p < 100; p  ) 
{ 
    threads.Add(new Thread(() => MyTask())); 
} 
// Start them all
foreach (var thread in threads)
{
    thread.Start(); 
}
// Wait for completion
foreach (var thread in threads) 
{
    thread.Join(); 
}
  

Ответ №2:

Вы определенно можете использовать ThreadPool для своей задачи, но вы должны знать, как ThreadPool управляет потоками. Если вы попытаетесь запустить 100 потоков таким образом:

 for (int i = 0; i < 100; i  )
{
    ThreaPool.QueueUserWorkItem(state => UnitOfWork());
}
  

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

Но я думаю, вам не стоит беспокоиться об этом. Сначала попробуйте использовать ThreadPool, установите максимальное ограничение на 100 шагов (или выше) с помощью ThreadPool.Установите maxThreads(100) и поставьте запросы в очередь, как я писал выше.

И если после этого вам захочется чего-то более сложного, вы можете использовать класс Thread. Создайте 100 экземпляров Thread класса, запустите их все и используйте. Если вы будете использовать Thread класс, вы можете контролировать время жизни каждого потока, т. Е. ожидать завершения потоков без использования каких-либо дополнительных приемов.

Комментарии:

1. Хорошо, спасибо, но у меня есть еще один вопрос. Я установил ThreadPool. SetMaxThreads(100,100) но это не работает на 100 потоков. Существует ли какое-либо количество потоков по умолчанию? Я использую консольное приложение

2. Что вы имеете в виду, говоря «не работает»? Не могли бы вы немного объяснить? Кстати, вы можете принудительно ThreadPool запускать задачи в очереди, а не ставить их в очередь, устанавливая минимальное ограничение потоков, используя msdn.microsoft.com/en-us/library /… . Как сказано в MSDN, вы должны осторожно использовать ThreadPool пользовательские ограничения, особенно в производственной среде.

Ответ №3:

Если вы установите maxThreads равным 100 и более, это, вероятно, лучшее решение.

 ThreadPool.SetMaxThreads(100)