麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

ParallelProgramming-實現(xiàn)并行操作的流水線(生產(chǎn)者、消費者)

2019-11-14 13:46:45
字體:
供稿:網(wǎng)友

本文介紹如何使用C#實現(xiàn)并行執(zhí)行的流水線(生產(chǎn)者消費者):

  1. 流水線示意圖
  2. 實現(xiàn)并行流水線

 

一、流水線示意圖

上圖演示了流水線,action1接收input,然后產(chǎn)生結(jié)果保存在buffer1中,action2讀取buffer1中由action1產(chǎn)生的數(shù)據(jù),以此類推指導(dǎo)action4完成產(chǎn)生Output。

以上也是典型的生產(chǎn)者消費者模式

上面的模式如果使用普通常規(guī)的串行執(zhí)行是很簡單的,按部就班按照流程圖一步一步執(zhí)行即可。如果為了提高效率,想使用并行執(zhí)行,也就是說生產(chǎn)者和消費者同時并行執(zhí)行,該怎么辦么?

二、實現(xiàn)并行流水線

2.1 代碼

class PiplelineDemo    {        PRivate int seed;        public PiplelineDemo()        {            seed = 10;        }        public void Action1(BlockingCollection<string> output)        {            try            {                for (var i = 0; i < seed; i++)                {                    output.Add(i.ToString());//initialize data to buffer1                }            }            finally            {                output.CompleteAdding();            }        }        public void Action2(BlockingCollection<string> input, BlockingCollection<string> output)        {            try            {                foreach (var item in input.GetConsumingEnumerable())                {                    var itemToInt = int.Parse(item);                    output.Add((itemToInt * itemToInt).ToString());// add new data to buffer2                }            }            finally            {                output.CompleteAdding();            }        }        public void Action3(BlockingCollection<string> input, BlockingCollection<string> output)        {            try            {                foreach (var item in input.GetConsumingEnumerable())                {                    output.Add(item);//set data into buffer3                }            }            finally            {                output.CompleteAdding();            }        }        public void Pipeline()        {            var buffer1 = new BlockingCollection<string>(seed);            var buffer2 = new BlockingCollection<string>(seed);            var buffer3 = new BlockingCollection<string>(seed);            var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None);            var stage1 = taskFactory.StartNew(() => Action1(buffer1));            var stage2 = taskFactory.StartNew(() => Action2(buffer1, buffer2));            var stage3 = taskFactory.StartNew(() => Action3(buffer2, buffer3));            Task.WaitAll(stage1, stage2, stage3);            foreach(var item in buffer3.GetConsumingEnumerable())//print data in buffer3            {                Console.WriteLine(item);            }        }    }    class Program    {        static void Main(string[] args)        {            new PiplelineDemo().Pipeline();            Console.Read();        }    }

2.2 運行結(jié)果

預(yù)期打印出了0-9自我相乘的結(jié)果。

2.3 代碼解釋

代碼本身的邏輯和本文開始的流程圖是一一對應(yīng)的。

BlockingCollection<T>是.Net里面的一個線程安全集合。實現(xiàn)了IProducerConsumerCollection<T>.

  1. Add方法:將元素加入集合
  2. CompleteAdding方法:告訴消費者,在當(dāng)調(diào)用該方法之前的元素處理完之后就不要再等待處理了,可以結(jié)束處理了。這個非常重要,一定要執(zhí)行,所以放在finally中(就算exception也要執(zhí)行)
  3. GetConsumingEnumberable,給消費者返回一個可以便利的集合

GetConsumingEnumberable是一個非常強大的東東,專門寫一片文章介紹介紹。

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 天天鲁在线视频免费观看 | 日韩剧情片 | 九九热在线免费观看视频 | 欧美一级黄色网 | 久久久一区二区三区视频 | 久久精品亚洲精品国产欧美kt∨ | 成人精品视频在线 | 成人nv在线观看 | 九九热在线视频免费观看 | 国产精品99久久久久久久 | 久久成人福利 | 成人午夜免费网站 | 免费观看一区 | 久久国产中文 | 中国杭州少妇xxxx做受 | 91社| 性片网站 | 久久激情小视频 | 斗破苍穹在线观看免费完整观看 | 视频一区二区精品 | 久久精品视频在线免费观看 | 国产人成精品一区二区三 | 国产午夜电影在线观看 | 蜜桃一本色道久久综合亚洲精品冫 | 91久久线看在观草草青青 | 亚洲一区在线免费视频 | 国产成人精品二区 | 黄污网站在线观看 | lutube成人福利在线观看 | 亚洲精品欧美在线 | 毛片电影网址 | 中文区永久区 | 中文字幕观看 | 成人在线视频精品 | 狠狠干五月天 | 久久久视频免费观看 | 大奶一级片 | 色播av在线| 日本在线不卡一区二区 | 国产亚洲美女精品久久久2020 | 美国av免费看 |