Кто-то может перечислить некоторые точки сравнения между Потоком, Мечущим икру по сравнению с Объединением Потока, какой лучше? Рассмотрите платформу.NET как ссылочную реализацию, которая поддерживает обоих.
Для некоторого определения «лучше» вы обычно хотите пойти с пулом нитей. Не зная, что ваше дело использование, считайте, что с пулом потока у вас есть фиксированное количество потоков, которые все могут быть созданы при запуске или могут быть созданы по требованию (но количество потоков не может превышать размер пула). Если задача отправляется, и ни один поток не доступен, он введен в очередь до тех пор, пока не будет свободен нити.
Если вы нерестоты потоки в ответ на запросы или какой-либо другой вид триггера, вы запускаете риск истощения всех ваших ресурсов, так как нет ничего, чтобы загрузить количество потоков.
Другим преимуществом объединения потоков является повторное использование - одни и те же потоки используются снова и снова для обработки разных задач, а не для необходимости создания нового потока каждый раз.
Как указывалось с другими, если у вас небольшое количество задач, которые долго будут работать, это будет отрицать преимущества, полученные, избегая частого создания резьбы (так как вам не нужно создавать тонна потоков в любом случае) Отказ
Мое чувство состоит в том, что вы должны начать только путем создания потока по мере необходимости ... Если производительность этого в порядке, то вы закончите. Если в какой-то момент вы обнаружите, что вам нужна более низкая задержка вокруг создания нити, вы можете вообще перейти в пул резьбы, не сломав ничего ...
Это зависит от того, что вы хотите выполнить в другой поток.
Для короткой задачи лучше использовать пул резьбы, для длительной задачи, возможно, лучше появиться новую тему, поскольку она могла бы голодать пул резьбы для других задач.
Все зависит от сценария. Создание новых потоков - это ресурсоемкая и дорогостоящая операция. Большинство очень коротких асинхронных операций (максимум менее нескольких секунд) могут использовать пул потоков.
Для более продолжительных операций, которые необходимо выполнять в фоновом режиме, обычно создается собственный поток. (Ab) использование встроенного threadpool платформы/среды выполнения для длительных операций может привести к неприятным формам взаимоблокировок и т.д.
-121--1299636-Если вы еще не просмотрели Visual Studio Database Edition GDR (а.k.a. «Data Dude»), вы определенно должны загрузить его и опробовать:
Среди прочего, GDR облегчит разработку команды, облегчив каждому разработчику ведение собственной локальной копии базы данных, сценариев версий, создание сценариев развертывания для перемещения схемы базы данных в новую версию и даже поддержку отката базы данных.
Это бесплатно, если вы используете team system developer edition. Попробуйте.
-121--4268588-Для создания/создания потока требуется мало дополнительного времени, поскольку опрос потока уже содержит созданные потоки, которые готовы к использованию.
Нитки пула резьбы намного дешевле, чем обычная нить, они пуляют системные ресурсы, необходимые для потоков. Но у них есть ряд ограничений, которые могут сделать их непригодными:
Последние два ограничения являются побочным эффектом планировщика ThreadPool, он пытается ограничить количество активных потоков к количеству сердечников, которые имеется ваш ЦП. Это может вызвать длительные задержки, если вы запланировате много длинных беговых нитей часто.
Многие другие реализации ThreadPool имеют аналогичные ограничения, дают или взять.
Основное отличие состоит в том, что Threadpool поддерживает набор нитей, которые уже выделяются и доступны для использования, поскольку запуск нового потока может быть дорогим процессором-мудрым.
Обратите внимание, что даже Threadpool необходимо «порождать» нити ... Обычно это зависит от рабочей нагрузки - если есть много работы, хороший Threadpool раскрутит новые потоки для обработки нагрузки на основе нагрузки на основе нагрузки и системные ресурсы.
Проблема, связанная с выражением, заключается в том, что оно совпадает с пустой последовательностью, что означает, что если вы это сделаете:
>>> 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) использование встроенного блока потоков платформы/среды выполнения для длительных операций может привести к неприятным формам взаимоблокировок и т.д.
«Пул» содержит список доступных «потоков», готовых к использованию, тогда как «порождение» означает фактическое создание нового потока.
Полезность «пула потоков» заключается в «меньшем времени использования»: устраняются накладные расходы времени на создание.
Что касается того, «какой из них лучше»: это зависит от обстоятельств.Если накладные расходы времени создания являются проблемой, используйте пул потоков. Это обычная проблема в средах, где необходимо выполнять множество «краткосрочных задач».
Как указали другие люди, существуют «накладные расходы на управление» для пула потоков: они минимальны при правильной реализации. Например. ограничение количества потоков в пуле тривиально.