Как сделать красиво?з ThreadPool. Как это сделать красиво, в
От: Ka3a4oK  
Дата: 06.07.11 13:13
Оценка:
Есть некая коллекция или даже IEnumerable. Нужно создать новую коллекцию путем преобразования каждого элемента исходной коллекции(Map). При этом хочется распараллелить обработку через ThreadPool. Как это сделать красиво, в Nemerle-way стиле. Через Computation Expressions должно красиво получится, мне кажется.
Re: Как сделать красиво?з ThreadPool. Как это сделать красив
От: hardcase Пират http://nemerle.org
Дата: 06.07.11 13:32
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Как это сделать красиво


В .NET 4.0 можно использовать PLINQ.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Как сделать красиво?з ThreadPool. Как это сделать кра
От: Ka3a4oK  
Дата: 06.07.11 13:48
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Ka3a4oK, Вы писали:


KK>>Как это сделать красиво


H>В .NET 4.0 можно использовать PLINQ.


В Nemerle есть возможность использовать PLINQ?
Re[3]: Как сделать красиво?з ThreadPool. Как это сделать кра
От: hardcase Пират http://nemerle.org
Дата: 06.07.11 14:11
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>В Nemerle есть возможность использовать PLINQ?


Под .NET 4.0 — да.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Как сделать красиво?з ThreadPool. Как это сделать кра
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.11 15:09
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

H>>В .NET 4.0 можно использовать PLINQ.

KK>В Nemerle есть возможность использовать PLINQ?

Естественно. Это же просто библиотека.

Если PLINQ по каким-то причинам использовать не получится, то можно один из следующий самопалов использовать:
С использованием ComputationExpressions (надо добавить ссылку на сборки ComputationExpressions.Macros.dll и ComputationExpressions.dll):
public ParallelMap[TIn, TOut](this source : Seq[TIn], convert : TIn -> TOut) : Seq[TOut]
{
  source.MapToArray(e => (comp async return convert(e)).Start()).MapToArray(_.Value)
}

Или прямо на базе пула:
public ParallelMap[TIn, TOut](this source : Seq[TIn], convert : TIn -> TOut) : Seq[TOut]
{
  def actionDelegate : Func[TIn, TOut] = convert;
  def results = source.MapToArray(a => actionDelegate.BeginInvoke(a, null, null));
  def waitHandles = results.MapToArray(_.AsyncWaitHandle);
  _ = Threading.WaitHandle.WaitAll(waitHandles);
  results.MapToArray(actionDelegate.EndInvoke)
}


В догонку ParallelForEach:
public ParallelForEach[T](this source : Seq[T], action : T -> void) : void
{
  def actionDelegate : Action[T] = action;
  def waitHandles = source.MapToArray(a => actionDelegate.BeginInvoke(a, null, null).AsyncWaitHandle);
  _ = Threading.WaitHandle.WaitAll(waitHandles);
}


Только учти, что выигрыш от распараллеливания подобным образом будет только, если распараллеливаемые участки кода выполняются относительно долго (не меньше десятых долей секунды). Иначе все уйдет в гудок (время будет тратиться на переключение контекста и прочую байду). Еще в вызываемых функциях не должно быт блокировок.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.