当某些并行进程执行繁重的工作时,数据流会阻塞

Posted

技术标签:

【中文标题】当某些并行进程执行繁重的工作时,数据流会阻塞【英文标题】:Dataflow blocks when some parallel process does a heavy job 【发布时间】:2019-08-25 22:27:43 【问题描述】:

我正在尝试了解 TPL 数据流。 我有两个块 inputBlock och nextBlock。

使用 MaxDegreeOfParallelism = 2 的输入块。 我有这种情况,它可能需要不同的时间来完成并行作业。我不希望数据流停止,因为某些并行工作需要很长时间才能完成。 我只是希望每个并行作业从队列中取出一个项目并对其进行处理,然后将其传递给下一个块。

当第一个块“inputBlock”中的一个并行作业进入睡眠状态或执行繁重的工作时,我永远不会到达 nextBlock。

internal class Program

    private static bool _sleep = true;

    private static void Main(string[] args)
    
        var inputBlock = new TransformBlock<string, string>(
            x =>
            
                if (_sleep)
                
                    _sleep = false;
                    Console.WriteLine("First thread sleeping");
                    Thread.Sleep(5000000);
                
                Console.WriteLine("Second thread running");
                return x;
            ,
            new ExecutionDataflowBlockOptions MaxDegreeOfParallelism = 2); //1


        var nextBlock = new TransformBlock<string, string>(
            x =>
            
                Console.WriteLine(x);
                return x;
            ); //2

        inputBlock.LinkTo(nextBlock, new DataflowLinkOptions PropagateCompletion = true);


        for (var i = 0; i < 100; i++)
        
            input.Post(i.ToString());
        

        input.Complete();

        Console.ReadLine();
    

【问题讨论】:

【参考方案1】:

使用 EnsureOrdered = false 就是答案。

新的 ExecutionDataflowBlockOptions MaxDegreeOfParallelism = 2, EnsureOrdered = false);

【讨论】:

以上是关于当某些并行进程执行繁重的工作时,数据流会阻塞的主要内容,如果未能解决你的问题,请参考以下文章

进程VS程序

python进程不能并行的原因,进程阻塞

30分钟读懂进程线程同步异步阻塞非阻塞并发并行

node - 非阻塞的异步 IO

并发编程

深入理解并发/并行,阻塞/非阻塞,同步/异步