贪心JoinBlock解释

3
在默认贪婪模式下,所有提供给目标的数据都被接受,即使其他目标没有必要的数据来形成元组。
根据我的理解,我可以使用以下代码段进行接收。
var block = new JoinBlock<int,int>(new GroupingDataflowBlockOptions(){Greedy = true});
block.Target1.Post(1);
//block.Target2.Post(2);
var tuple = block.Receive();

有人能否解释一下为什么我需要将数据发布到两个目标?
1个回答

1
该块将数据接收到一个目标,但只有在能够形成元组时才会传播数据。换句话说,您可以随意填写target1,但如果target2中没有任何内容,就永远无法获得任何数据。
贪婪行为可能是一个问题,如果你已经将负载分散到多个连接块中。一个块会吸收所有的输入数据,而不给其他块一个机会。
非贪婪连接的使用也可以帮助您防止应用程序中的死锁。在软件应用程序中,当两个或多个进程都持有资源并相互等待另一个进程释放某些其他资源时,死锁会发生。考虑一个定义了两个JoinBlock对象的应用程序。两个对象都从两个共享源块中读取数据。在贪心模式下,如果一个连接块从第一个源读取,而第二个连接块从第二个源读取,应用程序可能会死锁,因为两个连接块彼此等待对方释放其资源。在非贪心模式下,每个连接块只在所有数据可用时从其源读取数据,因此,消除了死锁的风险。

来源:如何使用JoinBlock从多个源读取数据


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接