Пул потоков по сравнению с порождением потока

Кто-то может перечислить некоторые точки сравнения между Потоком, Мечущим икру по сравнению с Объединением Потока, какой лучше? Рассмотрите платформу.NET как ссылочную реализацию, которая поддерживает обоих.

34
задан Hans Passant 22 May 2013 в 16:37
поделиться

8 ответов

Для некоторого определения «лучше» вы обычно хотите пойти с пулом нитей. Не зная, что ваше дело использование, считайте, что с пулом потока у вас есть фиксированное количество потоков, которые все могут быть созданы при запуске или могут быть созданы по требованию (но количество потоков не может превышать размер пула). Если задача отправляется, и ни один поток не доступен, он введен в очередь до тех пор, пока не будет свободен нити.

Если вы нерестоты потоки в ответ на запросы или какой-либо другой вид триггера, вы запускаете риск истощения всех ваших ресурсов, так как нет ничего, чтобы загрузить количество потоков.

Другим преимуществом объединения потоков является повторное использование - одни и те же потоки используются снова и снова для обработки разных задач, а не для необходимости создания нового потока каждый раз.

Как указывалось с другими, если у вас небольшое количество задач, которые долго будут работать, это будет отрицать преимущества, полученные, избегая частого создания резьбы (так как вам не нужно создавать тонна потоков в любом случае) Отказ

10
ответ дан 27 November 2019 в 16:36
поделиться

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

5
ответ дан 27 November 2019 в 16:36
поделиться

Это зависит от того, что вы хотите выполнить в другой поток.

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

1
ответ дан 27 November 2019 в 16:36
поделиться

Все зависит от сценария. Создание новых потоков - это ресурсоемкая и дорогостоящая операция. Большинство очень коротких асинхронных операций (максимум менее нескольких секунд) могут использовать пул потоков.

Для более продолжительных операций, которые необходимо выполнять в фоновом режиме, обычно создается собственный поток. (Ab) использование встроенного threadpool платформы/среды выполнения для длительных операций может привести к неприятным формам взаимоблокировок и т.д.

-121--1299636-

Если вы еще не просмотрели Visual Studio Database Edition GDR (а.k.a. «Data Dude»), вы определенно должны загрузить его и опробовать:

http://www.microsoft.com/downloads/details.aspx?FamilyID=bb3ad767-5f69-4db9-b1c9-8f55759846ed&displaylang=en

Среди прочего, GDR облегчит разработку команды, облегчив каждому разработчику ведение собственной локальной копии базы данных, сценариев версий, создание сценариев развертывания для перемещения схемы базы данных в новую версию и даже поддержку отката базы данных.

Это бесплатно, если вы используете team system developer edition. Попробуйте.

-121--4268588-

Для создания/создания потока требуется мало дополнительного времени, поскольку опрос потока уже содержит созданные потоки, которые готовы к использованию.

0
ответ дан 27 November 2019 в 16:36
поделиться

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

  • Вы не можете прервать нить Threadpool
  • . Нет простого способа обнаружить, что ThreadPool завершен, нет Thread.join ()
  • Путь к маршалам Исключения из потока Threadpool
  • Вы не можете отобразить какой-либо пользовательский интерфейс на ветке Threadpool за пределами окна сообщений
  • Поток Threadpool не должен работать дольше, чем несколько секунд
  • поток Threadpool не должен блокировать Долгое время

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

Многие другие реализации ThreadPool имеют аналогичные ограничения, дают или взять.

25
ответ дан 27 November 2019 в 16:36
поделиться

Основное отличие состоит в том, что Threadpool поддерживает набор нитей, которые уже выделяются и доступны для использования, поскольку запуск нового потока может быть дорогим процессором-мудрым.

Обратите внимание, что даже Threadpool необходимо «порождать» нити ... Обычно это зависит от рабочей нагрузки - если есть много работы, хороший Threadpool раскрутит новые потоки для обработки нагрузки на основе нагрузки на основе нагрузки и системные ресурсы.

2
ответ дан 27 November 2019 в 16:36
поделиться

Проблема, связанная с выражением, заключается в том, что оно совпадает с пустой последовательностью, что означает, что если вы это сделаете:

>>> p = re.compile('b*(abb*)*(a|)')
>>> p.match('c').group(0)
''

и поскольку re.match пытается соответствовать началу последовательности, вы должны сказать ему, чтобы оно соответствовало до конца последовательности. просто используйте $ для этого

>>> p = re.compile(r'b*(abb*)*(a|)$')
>>> print p.match('c')
None
>>> p.match('ababababab').group(0)
'ababababab'

ps- возможно, вы отметили, что я использовал r 'pattern' вместо 'образца' больше для этого здесь (первые абзацы)

-121--4594714-

Я реализовал свои собственные расширения WCF для Ninject 2,0, прежде чем узнал, что на Гитубе было это . Моя реализация немного отличается, но я придумал решение для объектов области:

using System;
using Ninject.Activation;

namespace Ninject.Contrib.Wcf {
  /// <summary>
  /// Defines Scope Callbacks for WCF Context.
  /// </summary>
  public class NinjectWcfScopeCallbacks {
    /// <summary>
    /// Defines WCF Context scope.
    /// </summary>
    public static readonly Func<IContext, object> WcfContext =
      ctx => (System.ServiceModel.OperationContext.Current != null
                ? System.ServiceModel.OperationContext.Current.
                    InstanceContext.
                    Extensions.Find<NinjectInstanceContext>()
                : null);

    /// <summary>
    /// Defines WCF Web Context scope.
    /// </summary>
    public static readonly Func<IContext, object> WcfWebContext = 
               ctx => System.ServiceModel.Web.WebOperationContext.Current;
  }
}

Для полноты я использую обратный вызов, определенный выше:

Bind<IHelloWorldService>()
        .To<HelloWorldService>()
        .InScope(NinjectWcfScopeCallbacks.WcfWebContext);

Служба WCF не размещала в WAS, поэтому не уверен, что вы используете WcfWebContext или WcfContext , определенный выше, но Если WebOperationContext работает, то вы все настроены. В противном случае я обнаружил, что все немного сложнее. Следует отметить, что в приведенном выше фрагменте кода используется класс NinâInstureContext , присоединенный к OperationContext . Это написанный мною класс, в котором используется механизм Ninject 2.0 «кэш и сбор», позволяющий детерминированно размещать объекты. В основном класс представляет собой реализацию IExtension < InstureContext > , которая является конструкцией WCF для присоединения почти всего к OperationContext . Этот класс также реализует интерфейс Ninject INotifyWhenDeposed , который обеспечивает поддержку детерминированной утилизации. Вот как выглядит определение класса:

  /// <summary>
  /// Defines a custom WCF InstanceContext extension that resolves service instances
  /// using Ninject.  
  /// <remarks>
  /// The custom InstanceContext extension provides support for deterministic disposal
  /// of injected dependencies and service instances themselves by being hook into 
  /// Ninject's "cache and collect" mechanism (new in Ninject 2.0) for object life cycle 
  /// management.  This allows binding object instances to the lifetime of a WCF context
  /// and having them deterministically deactivated and disposed.
  /// </remarks>
  /// </summary>
  public class NinjectInstanceContext : 
                IExtension<InstanceContext>, INotifyWhenDisposed {
  }

Остальное расширение WCF для Ninject совпадает с на Гитубе. Что в основном происходит, так это то, что создается поставщик экземпляров, который подключается к цепочке «активации» WCF - я не использую их конкретную терминологию, просто как я понимаю вещи. Таким образом, идея заключается в том, что ваш поставщик экземпляра должен предоставить экземпляры запрашиваемого класса службы WCF. Итак, вот где мы используем Ninject для создания экземпляра сервиса. Таким образом, мы также можем активировать и ввести любые зависимости. Поставщик экземпляра в моей реализации завершает ядро Ninject в экземпляре, если NinâInstureContext и присоединяет его к OperationContext . Создание службы затем делегируется этому расширению WCF. Когда провайдеру экземпляра говорят освободить службу, NinâInstureContext , который был присоединен к OperationContext, удаляется, что в способ реализации INotifyWhenDeposed вызывает детерминированное удаление службы (и, возможно, ее зависимостей).

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

-121--3003494-

Все зависит от сценария.Создание новых потоков - это ресурсоемкая и дорогостоящая операция. Большинство очень коротких асинхронных операций (максимум менее нескольких секунд) могут использовать пул потоков.

Для более продолжительных операций, которые необходимо выполнять в фоновом режиме, обычно создается собственный поток. (Ab) использование встроенного блока потоков платформы/среды выполнения для длительных операций может привести к неприятным формам взаимоблокировок и т.д.

5
ответ дан 27 November 2019 в 16:36
поделиться

«Пул» содержит список доступных «потоков», готовых к использованию, тогда как «порождение» означает фактическое создание нового потока.

Полезность «пула потоков» заключается в «меньшем времени использования»: устраняются накладные расходы времени на создание.

Что касается того, «какой из них лучше»: это зависит от обстоятельств.Если накладные расходы времени создания являются проблемой, используйте пул потоков. Это обычная проблема в средах, где необходимо выполнять множество «краткосрочных задач».


Как указали другие люди, существуют «накладные расходы на управление» для пула потоков: они минимальны при правильной реализации. Например. ограничение количества потоков в пуле тривиально.

21
ответ дан 27 November 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: