Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
О о л отек TPL Dataflow
TPL Dataflow – то то дл е о?
• Это л отек , т е Microsoft, п о т е е е NuGet
• TPL Dataflow по о ет по т п о од тел о т у то о т у е п ллел п ло е
• TPL Dataflow л ет е л е одел кто о
• под од, о о по т ое л тел о о ко е е , о то е о л тел локо , от п ллел о е о д у от д у
• оде т е п о од т путё пе ед о оо е е ду лок
Модел кто о Это те т е к одел п ллел ле кото о
кто л ет л тел о у о т . кто о ет: • п т оо е от д у кто о
• отп т оо е д у кто
• о д т о е кто
• пол т к ку -л о п у у кто у оту
• ет о то е
кто п у ут е п ллел
кто ол о д у от д у
кто оде т у т д у д у о путё о е а и х о ы и оо е
К т к те ет
о одел
о у о т – лок dataflow (dataflow block)
т т д локо : • лок то к source blocks) – де т у т к к то к
д – о о т т
• лок п ё к target blocks) – де т у т к к п ё к д – о о п т
• лок п о т тел propagator blocks) – де т у т к к од о е е о то к п ё к д – / о о
т т , п т
Д те е о
п те е оо е лок Dataflow
лок п едо т л т л е по о п те оо е
е т о о п / те :
var bufferBlock = new BufferBlock<int>();
// Send messages to the block asynchronously.
for (var i = 0; i < 3; ++i)
{
await bufferBlock.SendAsync(i);
}
// Asynchronously receive the messages back from the block.
for (var i = 0; i < 3; ++i)
{
Console.WriteLine(await bufferBlock.ReceiveAsync());
}
/* Output:
0
1 2 */
е локо
• лок о о т , о у ко е е л
• Од лок то к о о т о е т о локо п ё ко • Од лок п ё к о о т о е т о локо
то ко
• И пол ует етод ISourceBlock<TOutput>.LinkTo
• Метод LinkTo допол тел о о ет п т п ед к т, по ол л т о т оо е
е локо - де о т var bufferBlock = new BufferBlock<int>();
var batchBlock = new BatchBlock<int>(4);
var actionBlock = new ActionBlock<int[]>(values => Console.WriteLine(String.Join(" ", values)));
// Link bufferBlock output to batchBlock input
bufferBlock.LinkTo(batchBlock, new DataflowLinkOptions { PropagateCompletion = true });
// Link batchBlock output to actionBlock input
batchBlock.LinkTo(actionBlock, new DataflowLinkOptions { PropagateCompletion = true });
for (var i = 0; i < 16; ++i)
{
await bufferBlock.SendAsync(i);
}
// Complete blocks and wait for completion to avoid them to be early collected by GC
bufferBlock.Complete(); await actionBlock.Completion;
/* Output:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15 */
едоп еделё е лок
О дел т 3 к те о : • у е е лок uffering lo ks
• И пол тел е лок exe ution lo ks
• упп у е лок grouping lo ks
Бу е е лок (buffering blocks)
BufferBlock<T>
• е л ует о е ед FIFO о е о е
• оо е о ут п од т о е т то ко у у од т о о е т о п ё ко п то к дое оо е е поп д ет
тол ко од п ё к
• оле е е л т е ует т о до т к е оо е оп еделё п ё к
BroadcastBlock<T> • оле е , ко д у о пе ед т к дое оо е е е п ё к
• Т к е поле е , ко д т е ует пе ед т о е т о оо е оп еделё о у п ё ку п то п ё ку е д т е ует тол ко ое по лед ее оо е е т. е. е ол ует поте оо е
WriteOnceBlock<T>
• Я л ет т лу е Broad astBlo k<T>
• Отл е о то т то то е о о о п т е о од о оо е е
пол тел е лок (execution blocks)
ActionBlock<TInput>
• Это лок-п ё к
• пол ет д ое де т е д к д по туп оо е е
• е т е о ет т : • о ое – д ёт по о Action<TInput>
• о ое – д ёт по о Func<TInput, Task>
TransformBlock<TInput, TOutput>
• Т о ует к дое од ее оо е е од ее оо е е пол д ое де т е
• е т е о ет т : • о ое – д ёт по о Func<TInput, TOutput>
• о ое – д ёт по о Func<TInput, Task<TOutput>>
TransformManyBlock<TInput, TOutput>
• о о TransformBlock
• Т о ует к дое од ее оо е е по ледо тел о т од оо е пол д ое де т е
• е т е о ет т : • о ое – д ёт по о Func<TInput, IEnumerable<TOutput>>
• о ое – д ёт по о Func<TInput, Task<IEnumerable<TOutput>>>
У о е п ллел
о у ол е пол тел е лок о т т тол ко од о оо е е од о е е о
о еде е по-у ол о о е т , д у о е п ллел – то по ол ет о т т од о е е о
о е т о оо е е
Г упп у е лок (grouping blocks)
BatchBlock<T>
Ко ует од е оо е п кет д о о е отд ёт к е т е од оо е
JoinBlock<T1, T2>, JoinBlock<T1, T2, T3>
о ет оо е д у л т ё е то ко п л т о к отд ёт к е т е од оо е
BatchedJoinBlock<T1, T2>, BatchedJoinBlock<T1, T2, T3>
Я л ет ко е Bat hBlo k JoinBlo k
е д о т (greedy mode)
упп у е лок о ут от т д о е- д о е
BatchBlock (4)
е д о т (greedy mode)
• д о е е по-у ол о п т е оо е
• е- д о е е о откл д т оо е -пото пок оде е удет до т то ое кол е т о оо е то
о о т од ое оо е е
• Это д ёт о о о т отд т т оо е д у лок е л т ко е е т )
При еча ие. одо о о по еде т к- е о о до т у т л о т о BoundedCapacity – к л е
од е о у е оо е – о о до туп о дл е локо е тол ко упп у
о д е о т е локо
• Мо о о у е л о т те е ISourceBlock<TOutput> / л ITargetBlock<TInput>
• Мо о пол о т етод Encapsulate<TInput, TOutput> кото к п ул ует ото ко ее локо о лок
Де о
д
• о д о по ко о т оке тек т т о е по о по ко о о е д о де о пол ует Bing • К дое де ое о е е о от т леду
о о : • о URL- д е у о е о о т QR-код
• М т о т о е е, е у ло т QR-код ло от п
• е т п ок е ул т у о е
о тое по ледо тел ое е е е
var images = await
if (images.Count != 0)
{
foreach (var imageUrl in images) {
var sourceImage = await
if (sourceImage != null) {
var qrImage = await
var resultImage = await
AddImage(resultImage);
}
} }
Dataflow- е е е
SearchImages
Search Text TransformManyBlock URL URL URL
BroadCastBlock
TransformBlock
DownloadImage
TransformBlock
GenerateQrCode
DisplayImage
JoinBlock
ActionBlock
TransformBlock
ProcessImage
URL URL
QR Image Image
QR Image Image
Result Image
лк
• Dataflow (Task Parallel Library) on MSDN https://msdn.microsoft.com/en-us/library/hh228603.aspx
• TPL Dataflow Tour on Channel 9 http://channel9.msdn.com/posts/TPL-Dataflow-Tour
• Stephen Toub: Inside TPL Dataflow on Channel 9 http://channel9.msdn.com/Shows/Going+Deep/Stephen-Toub-Inside-TPL-Dataflow
• Actor Model in Wikipedia https://en.wikipedia.org/wiki/Actor_model