zoukankan      html  css  js  c++  java
  • c#实现golang 的channel

    使用.NET的 BlockingCollection<T>来包装一个ConcurrentQueue<T>来实现golang的channel。

    代码如下:

    public class Channel<T>
    {
        private BlockingCollection<T> _buffer;
    
        public Channel() : this(1) { }
        public Channel(int size)
        {
            _buffer = new BlockingCollection<T>(new ConcurrentQueue<T>(), size);
        }
    
        public bool Send(T t)
        {
            try
            {
                _buffer.Add(t);
            }
            catch (InvalidOperationException)
            {
                // will be thrown when the collection gets closed
                return false;
            }
            return true;
        }
    
        public bool Receive(out T val)
        {
            try
            {
                val = _buffer.Take();
            }
            catch (InvalidOperationException)
            {
                // will be thrown when the collection is empty and got closed
                val = default(T);
                return false;
            }
            return true;
        }
    
        public void Close()
        {
            _buffer.CompleteAdding();
        }
    
        public IEnumerable<T> Range()
        {
            T val;
            while (Receive(out val))
            {
                yield return val;
            }
        }
    }

    测试程序

    [TestCase]
        public void TestSPSC_Performance()
        {
            int numItems = 10000000;
            int numIterations = 10;
    
            var stopWatch = new Stopwatch();
            stopWatch.Start();
            for (int i = 0; i < numIterations; ++i)
            {
                var channel = new Channel<int>(100);
                var writer = Task.Factory.StartNew(() => { foreach (var num in Enumerable.Range(1, numItems)) { channel.Send(num); } channel.Close(); });
                var reader = Task.Factory.StartNew<List<int>>(() => { var res = new List<int>(numItems); foreach (var num in channel.Range()) { res.Add(num); } return res; });
                Task.WaitAll(writer, reader);
            }
            stopWatch.Stop();
    
            var elapsedMs = stopWatch.Elapsed.TotalMilliseconds;
            Console.WriteLine("SPSC N = {0}: {1:.00}ms/iteration, {2:.00}ns/item (tx+rx)", numItems,  elapsedMs / numIterations, elapsedMs * 1000.0 / numItems / numIterations);
        }
  • 相关阅读:
    SpringMVC集成Swagger插件以及Swagger注解的简单使用
    Java后台直接生成二维码介绍
    Java条形码生成技术-Barcode4j
    对Java Serializable(序列化)的理解和总结(一)
    java下划线与驼峰命名互转
    Mybatis实战之TypeHandler高级进阶
    迪卡侬女主(视频) 第一集
    MySQL优化(五)
    PDO连接mysql和pgsql数据库
    MySQL的FIND_IN_SET()函数
  • 原文地址:https://www.cnblogs.com/visionwang/p/3456545.html
Copyright © 2011-2022 走看看