Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / чудеса с Threadpool / 25 сообщений из 41, страница 1 из 2
04.12.2012, 17:14
    #38064743
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
Что-то не понимаю я этот ThreadPool. Короче задача очень простая:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//объект бла бла
//ставим в пул, замеряем Время1.
      ThreadPool.UnsafeQueueUserWorkItem(метод, объект);

void Метод()
{
//Замеряем ВРЕМЯ_2
//сам рабочий код - Thread.Sleep( от 500 до 1000 мс)

}


Так вот разница между временем 1 и временем2 занимает до 10 секунд! Думал - ладно, наверное потоки заняты все. Задал 500 рабочих. После постановки смотрю - занято около 20, 480 свободно. И при этом код ждет !
Где подвох? В методе Sleep?
...
Рейтинг: 0 / 0
05.12.2012, 15:06
    #38066360
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
ну что, какие варианты? интересно же. Sleep убрал конечно, но вопрос выделения потоков интересен.
...
Рейтинг: 0 / 0
05.12.2012, 15:25
    #38066396
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivan,

можете привести тестовый код, как время замеряете?
...
Рейтинг: 0 / 0
05.12.2012, 15:32
    #38066411
beg-in-er
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivanГде подвох?
ну фокус может и просто открывается.
при вызове метода время может тратится на трансляцию этого метода в байткод.
тема такая проскакивала у меня 13491696
что если вызвать метод напрямую, а потом в трит забросить и так замерить.
ну или через тот же ngen прогнать
...
Рейтинг: 0 / 0
05.12.2012, 15:57
    #38066464
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivan,

насколько я понимаю ThreadPool не сразу запускает переданный делегат т.к. его предназанчение выполнять фоновые задачи. То есть задачи с сравнительно низким приоритетом. Если нужно чтобы это сразу запускалось создавай поток вручную.

beg-in-erпри вызове метода время может тратится на трансляцию этого метода в байтко
JIT-компиляция конечно замедляет исполнение, но не на 10 секунд же. Пример из твоего вопроса является крайним случаем.
...
Рейтинг: 0 / 0
05.12.2012, 16:15
    #38066510
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
LR,

время смотрю по записи в лог. используется log4net в данном случае.
Не понимаю одного - пулу ясно сказано - вот тебе 500 рабочих потоков, а он тормозит.
Явно создавать свой "пул" можно конечно, но вроде как не рекомендуется такой подход :)
...
Рейтинг: 0 / 0
05.12.2012, 16:31
    #38066545
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivan,

ну а если выполнить в цикле, несколько раз, проверить версию beg-in-er и bazile, будет каждый раз по 10 секунд или только первый раз?
...
Рейтинг: 0 / 0
05.12.2012, 16:32
    #38066548
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivanЯвно создавать свой "пул" можно конечно, но вроде как не рекомендуется такой подход :)
Писать свой пул потоков безусловно не нужно, но никто нам не запрещает использовать потоки напрямую, без пула.
...
Рейтинг: 0 / 0
05.12.2012, 17:01
    #38066631
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
bazile,

ну пул потоков я имел ввиду свой массив потоков и в нем уже добавлять/ брать из него потоки.
Вообщем в раздумьях.
Попробую через Task<>, хотя думаю тоже самое будет.
...
Рейтинг: 0 / 0
05.12.2012, 17:10
    #38066649
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivan,

думаю чудеса не с Threadpool, а с этим - "время смотрю по записи в лог. используется log4net в данном случае"
...
Рейтинг: 0 / 0
05.12.2012, 17:13
    #38066660
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
LR,

хм, не вижу повода не доверять ему в данном случае. Более того, по скорости записи дат обработки в базу это время подтверждается. Можно попробовать даже Datetime кидать в метод для большей уверенности.
...
Рейтинг: 0 / 0
05.12.2012, 17:17
    #38066667
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivanну пул потоков я имел ввиду свой массив потоков и в нем уже добавлять/ брать из него потоки.
А я имел в виду создание нового объекта Thread каждый раз когда нужно выполнить фоновую задачу.

Изначальный вопрос про задержку с выполнением ты задавал из любопытства или у тебя есть конкретная задача? Если да, то какая? Потому что в одном случае наличие задержки важно, в других нет. Все зависит от конкретной ситуации.
...
Рейтинг: 0 / 0
05.12.2012, 17:30
    #38066690
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivanразница между временем 1 и временем2 занимает до 10 секунд!
Только что набросал простейший код с ThreadPool. Задержки исполнения вообще не видно. Так что тут другие факторы работают. Возможно log4net долго поднимается (исполняется), возможно комп сильно нагружен.
...
Рейтинг: 0 / 0
05.12.2012, 17:36
    #38066713
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivan,

блин, ну вот скоко это выдаст? у меня - 0 мс
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    class Program
    {
        static void Метод(Object stateInfo)
        {
            Debug.WriteLine("ElapsedMilliseconds = {0}", ((Stopwatch)stateInfo).ElapsedMilliseconds);
            //сам рабочий код - Thread.Sleep( от 500 до 1000 мс)
        }
        static void Main(string[] args)
        {
            Stopwatch stopwatch = new Stopwatch();
            ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(Метод), stopwatch);
            Thread.Sleep(1000);
        }
    }
...
Рейтинг: 0 / 0
05.12.2012, 17:38
    #38066720
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
bazile,

вообще изначально я поставил под сомнение Thread.Sleep. На одном форуме нашел мысль,мол не применяйте Sleep в ThreadPool. Но никаких подробностей. После того как заменил код Sleep на обычный Web вызов таких задержек пока не обнаружил. Но меня в любом случае интересует каким образом пул выделяет потоки?
...
Рейтинг: 0 / 0
05.12.2012, 17:39
    #38066725
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
блин)))
Код: c#
1.
2.
3.
4.
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start(); //!!!
            ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(Метод), stopwatch);
            Thread.Sleep(1000);


у меня 1 мс
...
Рейтинг: 0 / 0
05.12.2012, 17:40
    #38066726
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
LR,

а если так: ?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
static void Main(string[] args)
        {
while(true)
{
            Stopwatch stopwatch = new Stopwatch();
//а тут разве stopwatch.Start не надо?
            ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(Метод), stopwatch);
            Thread.Sleep(10);
}
        }
...
Рейтинг: 0 / 0
05.12.2012, 17:41
    #38066729
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivan,

да, stopwatch.Start надо (см.выше), так скоко?
...
Рейтинг: 0 / 0
05.12.2012, 17:46
    #38066733
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
LR,

что, сколько? запустите в цикле :)
...
Рейтинг: 0 / 0
05.12.2012, 17:48
    #38066736
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivan,
сколько времени )) чудо проявилось?
...
Рейтинг: 0 / 0
05.12.2012, 17:49
    #38066741
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
LR,

время ща 17-50 по москве где-то :)
С веб запросом чудес с пулом пока не наблюдалось. Но подробнее обязательно исследую.
...
Рейтинг: 0 / 0
05.12.2012, 19:56
    #38066922
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivanвремя смотрю по записи в лог. используется log4net в данном случае.

log4net, сам ведёт свои записи используя тредрул, так что время им считать - это совсем ниочём
...
Рейтинг: 0 / 0
06.12.2012, 11:33
    #38067546
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivanвообще изначально я поставил под сомнение Thread.Sleep. На одном форуме нашел мысль,мол не применяйте Sleep в ThreadPool.
"Спящий" поток продолжает получать внимание со стороны планировщика ОС, поэтому он как бы и не "спит". Если нужно организовать паузу, то лучше создать waitHandle и ждать на нем. Кроме того в правильно написанном коде не должно быть необходимости в использовании пауз. Следует использовать нормальные механизмы синхронизации.

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

netivanНо меня в любом случае интересует каким образом пул выделяет потоки?
Это детали реализации которые тебя не должны волновать. Главное что пул выполнит переданный ему делегат в background потоке.
...
Рейтинг: 0 / 0
06.12.2012, 11:35
    #38067553
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
bazile,

да, конечно как временное решение.
Волновать не должно, но интересно.
...
Рейтинг: 0 / 0
06.12.2012, 20:01
    #38068654
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чудеса с Threadpool
netivanЧто-то не понимаю я этот ThreadPool. Короче задача очень простая:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//объект бла бла
//ставим в пул, замеряем Время1.
      ThreadPool.UnsafeQueueUserWorkItem(метод, объект);

void Метод()
{
//Замеряем ВРЕМЯ_2
//сам рабочий код - Thread.Sleep( от 500 до 1000 мс)

}


Так вот разница между временем 1 и временем2 занимает до 10 секунд! Думал - ладно, наверное потоки заняты все. Задал 500 рабочих. После постановки смотрю - занято около 20, 480 свободно. И при этом код ждет !
Где подвох? В методе Sleep?

Ты бы еще 4800 потоков сделал, тогды бы еще больше задержки были.
Создание трэда - целое кино и значительные накладные расходы. Подход в лоб, который тебн рекомендовали ничего не даст кроме тормозов.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / чудеса с Threadpool / 25 сообщений из 41, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]