在下面的测试代码中,我期望得到这样的结果:
ctx['location_ids'] = vals['location_ids']
TypeError: 'bool' object has no attribute '__getitem__'
但是实际结果是:
1, 2000
2, 4000
3, 6000
此外,我仅在6秒后才在屏幕上看到结果。这意味着任何竞争的输入都在等待并处理到下一个阶段。
如何使流水线在输入完成后立即吐出每个输入的结果?
3, 6000
2, 4000
1, 2000
答案 0 :(得分:4)
默认情况下,即使并行处理消息,数据流也会保留消息的顺序。
要尽快转换消息(即乱码),请在EnsureOrdered
的选项中将false
设置为TransformBlock
。
请确保使用最新版本的数据流(当前4.9版中存在nuget软件包System.Threading.Tasks.Dataflow
),因为EnsureOrdered
并不总是存在。
示例:
class Program
{
static void Main( string[] args )
{
var transformBlock = new TransformBlock<int, int>( x =>
{
Thread.Sleep( x );
return x;
}, new ExecutionDataflowBlockOptions {EnsureOrdered = false, MaxDegreeOfParallelism = 10} );
var actionBlock = new ActionBlock<int>( x => Console.WriteLine( x ) );
transformBlock.LinkTo( actionBlock, new DataflowLinkOptions {PropagateCompletion = true});
for( var i = 9; i > 0; i-- )
transformBlock.Post( i * 1000 );
transformBlock.Complete();
actionBlock.Completion.Wait();
Console.ReadLine();
}
}
此输出
1000
2000
3000
4000
5000
6000
7000
8000
9000