"- Отлично! Все переписываем задание, - Вовочка достал из кармана листок, на который он переписал задания, - теперь будем его решать в многопоточном режиме: ты быстрей дуй домой и в Интернет, вы двое в библиотеку, а ты карауль у выхода из класса - будешь спрашивать у выходящих их решения. Еще двое из группы поддержки остались не озадаченными, но пул потоков был уже сформирован, и Вовочке было пора возвращаться в класс на олимпиаду..."
Thread Pool. У каждого хорошего хозяина/хозяйки на кухне есть шкафчик, в котором он или она держат самые необходимые инструменты для приготовления еды (кухонный комбайн, кофеварка, смеситель, прибор для нарезки овощей, миксер, самовар :) ), вот этот шкафчик и называется пул потоков (кух.комбайн, миксер и т.д. – это потоки, которые нужны для решения часто повторяющихся задач). В роли задачи может быть: замес теста, нарезка овощей, приготовление чая/кофе и т.д.
Call-центр - типичный thread pool. Несколько (ну, как повезёт) операторов заняты принимают звонки клиентов, каждый новый звонок направляется одному из свободных операторов.
Call-центр - типичный thread pool. Несколько (ну, как повезёт) операторов заняты принимают звонки клиентов, каждый новый звонок направляется одному из свободных операторов.
А как быть с определением правильного числа потоков в пуле? ;) Мне кажется в этом-то как раз подвох, по крайней мере я расчитывал что подвох будет в этом ;). Нужно раскрыть ту идею, благодаря которой назначение задачи одному из заранее созданных потоков эффективнее, чем создание нового потока для каждой из вновь прибывших задач.
... как постоянный штат разнорабочих, одну и ту же работу можно дать любому из свободных. если работ становится больше, то некоторые из них будут начинаться позже, когда какой-либо рабочий освободится. так некоторые работы откладываются. если отложенных работ все накапливается, работодатель вынужден нанять еще одного или несколько работников, что требует некоторое время на их поиск и большую оплату на их содержание в штате.
... как постоянный штат разнорабочих, одну и ту же работу можно дать любому из свободных. если работ становится больше, то некоторые из них будут начинаться позже, когда какой-либо рабочий освободится. так некоторые работы откладываются. если отложенных работ все накапливается, работодатель вынужден нанять еще одного или несколько работников, что требует некоторое время на их поиск и большую оплату на их содержание в штате.
... что-то в этом роде. А теперь еще чтобы прочитав это я улыбнулся и запомнил навсегда. Помните еще про Анжелу? ;) http://software.intel.com/ru-ru/blogs/2008/12/25/2000464/
А как быть с определением правильного числа потоков в пуле? ;) Мне кажется в этом-то как раз подвох, по крайней мере я расчитывал что подвох будет в этом ;). Нужно раскрыть ту идею, благодаря которой назначение задачи одному из заранее созданных потоков эффективнее, чем создание нового потока для каждой из вновь прибывших задач.
Думайте дальше ;)
В книге S. Akhter, J.Roberts, Multi-Core Programming, Intel Press, 2006 на p.316 находим следующее определение:
"thread pool A collection of worker threads that are used to perform independent units of work on demand. Thread pools reduce the overhead of thread creation/destruction."
И никаких подвохов :) Мне кажется, не стоит путать понятие "коллекции потоков" и способы формирования этой коллекции. Объясню на пальцах: можно, например, восхищаться коллекцией монет в музее, ничего не зная о том, как она была сформирована. Могут быть две практически одинаковые коллекции: одна формировалась обычным способом - путем многолетней деятельности коллекционера, а другой "сформировал" ее в один день, ограбив инкассатора ;)
"thread pool A collection of worker threads that are used to perform independent units of work on demand. Thread pools reduce the overhead of thread creation/destruction."
Хорошо, нет подвохов. Как и нет (пока) понравившегося мне объяснения концепции, выделенной в вашей же цитате жирным шрифтом.
Я ведь не прошу объяснить "thread", хотя мысль такая была ;). Я спрашиваю о "threads pool".
На заводе штат рабочих выполняющих одну и ту же работу. Если есть работа то они ее делают, если нет то бездельничают.
Учитывая это: "thread pool A collection of worker threads that are used to perform independent units of work on demand. Thread pools reduce the overhead of thread creation/destruction." Можно каждый раз нанимать рабочего на работу и после того как работа закончилась увольнять его. А если уже есть подготовленный штат рабочих, то выигрышь во времени очевиден :-)
Стоим возле ряда телефоных автоматов которые работают только с помощью специальных жетонов. У нас в кармане имеется некоторое количество этих жетонов. К каждому жетону прикреплена ниточка. Ждем клиентов. Подходит клиент и просит жетон - даем ему жетон. Клиент опускает жетон в телефонный аппарат и разговаривает. Когда разговор окончен клиент вешает трубку и уходит. Мы подходим к аппарату и за ниточку вынимаем жетон из него и кладем снова в карман. Ждем нового клиента. Если подходит несколько клиентов одновременно выдаем каждому жетоны из кармана пока будет их хватать и одновременно следим за теми жетонами которые уже можно вынимать из аппаратов и возвращать в карман. Итого: жетон - поток, карман - пул.
Вы - бармен, у вас есть определенное количество посуды (пивных кружек, рюмок, граненых стаканов).Вся посуда это пул потоков. К вам пришли заказали пиво - вы как распределяющий поток выбрали ему пивную кружку. К вам пришло несколько человек - захотели выпить "по 50". Вы им выбрали граненые стаканы.
Если вдруг с близжайшего стадиона к вам завалится толпа болельщиков победившей команды, которые хотят выпить пиво, и одному из них не хватит кружки, вы как попросите этого невезунчика подождать пока первый клиент, который заказал пиво не допьет и не пойдет домой, и после того как его кружка освободится вы нальете радостному фанату пива, и все будут счастливы.
Когда мы идем в столовую, мы встречаемся с пулом подносов.
Подносы организованы в пул. Клиентов может быть намного меньше, чем подносов, и наоборот. Когда подносов много, они лежат без дела, когда подносов мало, клиенты ждут, пока они освободятся. Число подносов, то есть размер пула, заранее определяется так, чтобы в большинстве случаев клиенты не ждали подносов. Но случаются часы пик, когда клиентов очень много. Клиент все равно будет стоять в очереди к кассе, так что траты на подносы не принесут реальных выгод.
Представьте (или вспомните :-)) студенческую столовку во время большой перемены: «300 голодных студентов встают в очередь (tast queue) на обслуживание в общепит из пула вечно недовольных теток (thread pool). Как только тетка-поточница (aunt thread) закончила «обсчитывать» очередного студента :), она берется за следующего. Тетошный сервис работает в «параллельном» режиме – претензии не принимаются, отсюда экстремальная производительность. У нас в столовке пул всего из 3 потоков, каждый выдаёт пиццу «тараканы inside», чай, какаву или сок, потом тетка по шине скачивает весь налик себе в cache*. Система работает стабильно и быстро, так как пул создается с утра и готовит пиццу заранее на весь день. Для того чтоб переконфигурировать пул нужно его пересоздать целиком и полностью, но по опыту он будет так работать годами и всех устраивать. Вот…
*cache (англ. в знач.: «тайник»).
PS: После такова перекуса студенты иногда формирую очередь у пула туалетов… но это совсем не наша история.
Overall performance:
= Содержать бОльший пул требует слишком много ресурсов у завхоза. = Содержать меньший пул нельзя так как студенты невыстаивают очередь и после 2ой пары сваливают есть домой. = Увольнять лишних теток на каникулы нельзя так как потом найдешь только еще хуже.
Однажды гуси Владимир и Семен решили заработать денег, для этого они решили мыть машины в пробках. Долго и упорно наши друзья тренировались на мытье стекол, бутылок и даже друг друга... И вот пришел тот день: Семен и Владимир пошли на перекресток и принялись за дело. Поначалу все шло как по маслу, но в 6 вечера они поняли, что тысячи машин остаются непомытыми, хоть и стоят по часу в пробке, и водители уезжают обиженными.
Крепко задумавшись, гуси решили позвать всю стаю на подработку. Два месяца подготовки, тренинги на сплочение команды, мотивационные упражнения... Наконец, вся стая вышла на работу. Внезапно выяснилось, что теперь половина стаи остается без машин, хотя деньги договорились делить поровну. На этот раз было решено уволить половину стаи - это и было идеальным числом гусей (потоков) в компании (пуле).
С этого счастливого дня ни один Бентли не оставался грязным, и ни один гусь в компании не был обездоленным!
Thread Pool (пул потоков) - это... как многополосное движение на перекрестке.
Каждый занимает полосу из расчета, куда он хочет проехать: выбор большой - на все четыре стороны! или даже больше.
Каждая полоса обслуживает свой поток движения.
Если желающих ехать в одном направлении много - образуется пробка, проезд замедляется - приходится ждать, "поток" стекает со лба).
Вы, конечно скажете, что дорожникам надо бы проложить еще пару полос для разгрузки пробок - а они вам ответят, что это дело накладное и ждать придется полгода) Широкие дороги с кучей полос - тоже не всегда здорово: проедут по ним полторы машины в сутки, а затрат на обслуживание - уйма!
Мафиози в итальянском ресторане едят спагетти не по одной макаронине, а сразу POOL-ом, то бишь вилку в правой руке они вонзают в гору спагетти, политых томатом и майонезом, ложку в левой руке они подставляют под зубья вилки и начинают яростно закручивать, наматывая макаронинки на зубья вилки … Почему "яростно закручивать"? Потому что невозможно оставаться спокойным перед блюдом горячих, настоящих спагетти, политых густым томатом и майонезом.
Когда вы подходите к конюшне, выбираете себе приглянувшегося жеребца, и забираете его чтобы промчаться пару кругов по ипподрому. Получив максимум удовольствия, возвращаете усталое животное обратно.
Thread Pool, бабушка, - это твоя газовая плита. Ты можешь на ней готовить одновременно четыре блюда. Каждая конфорка - это thread, а все четыре конфорки - это thread pool. Понимаешь, бабушка?
Thread Pool, бабушка, - это твоя газовая плита. Ты можешь на ней готовить одновременно четыре блюда. Каждая конфорка - это thread, а все четыре конфорки - это thread pool. Понимаешь, бабушка?
И опять - см. выше. Непонятен момент оверхеда... Или иммется ввиду что когда у бабушки был простой примус, она подсчитала что 4 конфорки - нормальный пул для ее самой, дедушки, и внуков?
... -- это таксисты, которые ждут пассажиров в аэропорту. Человек прилетел, вышел, не нужно звонить, не нужно ждать, сразу сел и поехал. Быстро! ( вот только за багажом придется потом вернуться :)
Если пул свободных таксистов исчерпался, то пассажиру все же придется звонить и ждать пока его заберут. Поэтому, если рейсов много, то и пул должен быть большим. А в нелетную погоду таксистов можно отправить в город, чтобы не скучали ...
Мужик приехал на дачу, видит - забор не покрашен. Позвал жену, повалил на тахту, исполнил долг, подождал 9 месяцев, отпраздновал рождение сына, играл с ним, развивал, в школу отправил, тот 11 классов с папкиной помощью закончил. И вот приехали сын с отцом снова на дачу. Отец сына просит - покрась забор. Сын взял кисть и краску, начал красить. Три часа красил. Как закончил, пор с лица с тер и к отцу поворачивается, мол смотри папа какой я молодец. А батя то как достанет ствол из-за пазухи и сыну родному три пули. Пустил потом слезу, повернулся и тут глядь, а сарай то покосило, ремонтировать надо. Делать нечего, позвал жену, завалил на тахту.... Ну разве не идиот? Куда правильней - наделал детей по мере возможностей, взрастил, воспитал. А потом сидишь, пиво пьешь. Один забор красит, другой сарай правит, третий шашлычек над углями вращает. Это и есть thread pooling. Ряд созданных и подготовленных thread'ов ждет заданий, а не создается и подготавливается отдельный thread под каждую задачу