예제 #1
0
        public void SingleConsumerWithException()
        {
            var failed = new List <Exception>();
            var exec   = new ExceptionHandlingExecutor(failed.Add);

            using (IFiber one = PoolFiber.StartNew(exec))
                using (var reset = new AutoResetEvent(false))
                {
                    var channel = new QueueChannel <int>();

                    void OnMsg(int num)
                    {
                        if (num == 0)
                        {
                            throw new Exception();
                        }
                        reset.Set();
                    }

                    channel.Subscribe(one, OnMsg);
                    channel.Publish(0);
                    channel.Publish(1);
                    Assert.IsTrue(reset.WaitOne(10000, false));
                    Assert.AreEqual(1, failed.Count);
                }
        }
예제 #2
0
        public void SingleConsumerWithException()
        {
            var exec = new StubExecutor();
            var one  = new PoolFiber(new DefaultThreadPool(), exec);

            one.Start();
            var reset = new AutoResetEvent(false);

            using (one)
            {
                var          channel = new QueueChannel <int>();
                Action <int> onMsg   = delegate(int num)
                {
                    if (num == 0)
                    {
                        throw new Exception();
                    }
                    reset.Set();
                };
                channel.Subscribe(one, onMsg);
                channel.Publish(0);
                channel.Publish(1);
                Assert.IsTrue(reset.WaitOne(10000, false));
                Assert.AreEqual(1, exec.failed.Count);
            }
        }
예제 #3
0
        public void OnlyOneConsumer()
        {
            using (var queues = new Disposables())
            {
                IChannel <int>      channel = new QueueChannel <int>();
                ConcurrentBag <int> results = new ConcurrentBag <int>();

                void OnReceive(int message)
                {
                    results.Add(message);
                }

                //Init executing Fibers
                for (int i = 0; i < 10; i++)
                {
                    IFiber threadFiber = ThreadFiber.StartNew();
                    queues.Add(threadFiber);
                    channel.Subscribe(threadFiber, OnReceive);
                }
                //Push messages
                for (int i = 0; i < 1000000; i++)
                {
                    channel.Publish(i);
                }
                Thread.Sleep(100);
                Assert.AreEqual(1000000, results.Count);
                var r1 = results.OrderBy(x => x).ToArray();
                for (int i = 0; i < 1000000; i++)
                {
                    Assert.AreEqual(i, r1[i]);
                }
            }
        }
예제 #4
0
        public void SingleConsumer()
        {
            var one = new PoolFiber();

            one.Start();
            var oneConsumed = 0;
            var reset       = new AutoResetEvent(false);

            using (one)
            {
                var          channel = new QueueChannel <int>();
                Action <int> onMsg   = delegate
                {
                    oneConsumed++;
                    if (oneConsumed == 20)
                    {
                        reset.Set();
                    }
                };
                channel.Subscribe(one, onMsg);
                for (var i = 0; i < 20; i++)
                {
                    channel.Publish(i);
                }
                Assert.IsTrue(reset.WaitOne(10000, false));
            }
        }
예제 #5
0
        public void MultiConsumer()
        {
            using (var queues = new Disposables())
            {
                IChannel <string> channel = new QueueChannel <string>();

                //Init executing Fibers
                for (int i = 0; i < 5; i++)
                {
                    char OnReceive(string message)
                    {
                        return(message[0]);
                    }

                    IFiber threadFiber = new ThreadFiber(new Executor(), new TimerScheduler(), new SleepingQueue(), i.ToString());
                    threadFiber.Start();
                    queues.Add(threadFiber);
                    channel.Subscribe(threadFiber, x => OnReceive(x));
                }
                Stopwatch sw = new Stopwatch();
                sw.Start();

                //Push messages
                for (int i = 0; i < 1000000; i++)
                {
                    string msg = "[" + i + "] Push";
                    channel.Publish(msg);
                }
                sw.Stop();
                Console.WriteLine("End : " + sw.ElapsedMilliseconds);
            }
        }
예제 #6
0
        public void SingleConsumer()
        {
            int oneConsumed = 0;

            using (IFiber one = PoolFiber.StartNew())
                using (var reset = new AutoResetEvent(false))
                {
                    var channel = new QueueChannel <int>();

                    void OnMsg(int obj)
                    {
                        oneConsumed++;
                        if (oneConsumed == 20)
                        {
                            reset.Set();
                        }
                    }

                    channel.Subscribe(one, OnMsg);
                    for (int i = 0; i < 20; i++)
                    {
                        channel.Publish(i);
                    }
                    Assert.IsTrue(reset.WaitOne(10000, false));
                }
        }
예제 #7
0
        public void Multiple()
        {
            var queues = new List<IFiber>();
            var receiveCount = 0;
            var reset = new AutoResetEvent(false);
            var channel = new QueueChannel<int>();

            var messageCount = 100;
            var updateLock = new object();
            for (var i = 0; i < 5; i++)
            {
                Action<int> onReceive = delegate
                                            {
                                                Thread.Sleep(15);
                                                lock (updateLock)
                                                {
                                                    receiveCount++;
                                                    if (receiveCount == messageCount)
                                                    {
                                                        reset.Set();
                                                    }
                                                }
                                            };
                var fiber = new PoolFiber();
                fiber.Start();
                queues.Add(fiber);
                channel.Subscribe(fiber, onReceive);
            }
            for (var i = 0; i < messageCount; i++)
            {
                channel.Publish(i);
            }
            Assert.IsTrue(reset.WaitOne(10000, false));
            queues.ForEach(delegate(IFiber q) { q.Dispose(); });
        }
예제 #8
0
 public void SingleConsumer()
 {
     var one = new PoolFiber();
     one.Start();
     var oneConsumed = 0;
     var reset = new AutoResetEvent(false);
     using (one)
     {
         var channel = new QueueChannel<int>();
         Action<int> onMessage = delegate
         {
             oneConsumed++;
             if (oneConsumed == 20)
             {
                 reset.Set();
             }
         };
         channel.Subscribe(one, onMessage);
         for (var i = 0; i < 20; i++)
         {
             channel.Publish(i);
         }
         Assert.IsTrue(reset.WaitOne(10000, false));
     }
 }
예제 #9
0
        public void Run()
        {
            IFiberFactory factory             = new FiberFactory();
            int           OperationsPerInvoke = 1_000;

            using IChannel <string> _input  = new Channel <string>();
            using IChannel <string> _queue  = new QueueChannel <string>();
            using IChannel <string> _output = new Channel <string>();
            int count = 0;

            using AutoResetEvent reset = new AutoResetEvent(false);

            void Handler1(string x)
            {
                string u = x.ToUpper();

                _queue.Publish(u);
            }

            void Handler(string x)
            {
                string l = x.ToLower();

                _output.Publish(l);
            }

            void Action(string x)
            {
                int c = Interlocked.Increment(ref count);

                if (c >= OperationsPerInvoke)
                {
                    reset.Set();
                }
            }

            using ChannelAgent <string> fiber = new ChannelAgent <string>(factory, _input, Handler1);
            IDisposable[] middle = Enumerable.Range(0, 10)
                                   .Select(x => new ChannelAgent <string>(factory, _queue, Handler)).ToArray();
            using ChannelAgent <string> fiberOut = new ChannelAgent <string>(factory, _output, Action);

            for (int i = 0; i < OperationsPerInvoke; i++)
            {
                _input.Publish("a");
            }

            reset.WaitOne(TimeSpan.FromSeconds(20));
            foreach (IDisposable t in middle)
            {
                t.Dispose();
            }
        }
예제 #10
0
        public void MultiConsumerYielding()
        {
            var queues = new List <IFiber>();
            IChannel <string> channel = new QueueChannel <string>();
            int o = 0;

            //Init executing Fibers
            for (int i = 0; i < 5; i++)
            {
                void OnReceive(string message)
                {
                    var firstChar = message[0];

                    if (firstChar == firstChar)
                    {
                        o++;
                    }
                }

                IFiber threadFiber =
                    new ThreadFiber(new Executor(), new TimerScheduler(), new YieldingQueue(), i.ToString());
                threadFiber.Start();
                queues.Add(threadFiber);
                channel.Subscribe(threadFiber, OnReceive);
            }
            Stopwatch sw = new Stopwatch();

            sw.Start();

            //Push messages
            for (int i = 0; i < 1000000; i++)
            {
                string msg = "[" + i + "] Push";
                channel.Publish(msg);
            }
            sw.Stop();
            Console.WriteLine("End : " + sw.ElapsedMilliseconds);
            // Console.ReadLine();

            //#Results:
            //1 ThreadFiber ~= 1sec
            //2 ThreadFiber ~=> 3sec
            //3 ThreadFiber ~=> 5sec
            //4 ThreadFiber ~=> 8sec
            //5 ThreadFiber ~=> 10sec
        }
예제 #11
0
        public void MultiConsumerPool()
        {
            var queues = new List <IFiber>();
            IChannel <string> channel = new QueueChannel <string>();

            //Init executing Fibers
            for (int i = 0; i < 5; i++)
            {
                Action <string> onReceive = (message) =>
                {
                    var firstChar = message[0];
                    //Console.WriteLine("[{0}] {1}", Thread.CurrentThread.ManagedThreadId, message);
                };

                IFiber threadFiber = PoolFiber.StartNew();//new ThreadFiber(new Executor(),new TimerScheduler(),new YieldingQueue() , i.ToString());//new DisruptorQueue(1024*1024)
                queues.Add(threadFiber);
                channel.Subscribe(threadFiber, onReceive);
            }


            Stopwatch sw = new Stopwatch();

            sw.Start();

            //Push messages
            for (int i = 0; i < 1000000; i++)
            {
                string msg = "[" + i + "] Push";
                channel.Publish(msg);
            }
            sw.Stop();

            Console.WriteLine("End : " + sw.ElapsedMilliseconds);

            //#Results:
            //1 ThreadFiber ~= 1sec
            //2 ThreadFiber ~=> 3sec
            //3 ThreadFiber ~=> 5sec
            //4 ThreadFiber ~=> 8sec
            //5 ThreadFiber ~=> 10sec
        }
예제 #12
0
        public void MultiConsumer()
        {
            var queues = new List<FiberBase>();
            IChannel<string> channel = new QueueChannel<string>();

            //Init executing Fibers
            for (int i = 0; i < 5; i++)
            {
                Action<string> onReceive = (message) =>
                {
                    var firstChar = message[0];

                };

                FiberBase threadFiber = new ThreadFiber(new Executor(),new TimerScheduler(),new SleepingQueue() , i.ToString());//new DisruptorQueue(1024*1024)
                queues.Add(threadFiber);
                channel.Subscribe(threadFiber, onReceive);
            }

            Stopwatch sw = new Stopwatch();
            sw.Start();

            //Push messages
            for (int i = 0; i < 1000000; i++)
            {
                string msg = "[" + i + "] Push";
                channel.Publish(msg);
            }
            sw.Stop();

            Console.WriteLine("End : " + sw.ElapsedMilliseconds);
               // Console.ReadLine();

            //#Results:
            //1 ThreadFiber ~= 1sec
            //2 ThreadFiber ~=> 3sec
            //3 ThreadFiber ~=> 5sec
            //4 ThreadFiber ~=> 8sec
            //5 ThreadFiber ~=> 10sec
        }
예제 #13
0
        private void QueueChannelTest(int fibers, Func <IFiber> factory, int messageCount)
        {
            using (var queues = new Disposables())
            {
                int receiveCount = 0;
                using (var reset = new AutoResetEvent(false))
                {
                    var channel = new QueueChannel <int>();
                    void OnReceive(int obj)
                    {
                        int x = Interlocked.Increment(ref receiveCount);

                        if (x == messageCount)
                        {
                            reset.Set();
                        }
                    }

                    for (int i = 0; i < fibers; i++)
                    {
                        IFiber fiber = factory();
                        queues.Add(fiber);
                        channel.Subscribe(fiber, OnReceive);
                    }
                    Stopwatch sw = new Stopwatch();
                    sw.Start();

                    //Push messages
                    for (int i = 0; i < messageCount; i++)
                    {
                        channel.Publish(i);
                    }
                    sw.Stop();
                    Console.WriteLine($"Fibers: {fibers}  MessageCount: {messageCount}");
                    Console.WriteLine("End : " + sw.ElapsedMilliseconds);
                    Assert.IsTrue(reset.WaitOne(10000, false));
                }
            }
        }
예제 #14
0
        public void Multiple()
        {
            const int     MessageCount = 100;
            List <IFiber> queues       = new List <IFiber>();
            int           receiveCount = 0;

            using AutoResetEvent reset = new AutoResetEvent(false);
            object updateLock = new object();

            void OnReceive(int obj)
            {
                Thread.Sleep(15);
                lock (updateLock)
                {
                    Interlocked.Increment(ref receiveCount);
                    if (receiveCount == MessageCount)
                    {
                        reset.Set();
                    }
                }
            }

            QueueChannel <int> channel = new QueueChannel <int>();

            for (int i = 0; i < 5; i++)
            {
                Fiber fiber = new Fiber();
                queues.Add(fiber);
                channel.Subscribe(fiber, OnReceive);
            }

            for (int i = 0; i < MessageCount; i++)
            {
                channel.Publish(i);
            }

            Assert.IsTrue(reset.WaitOne(10000, false));
            queues.ForEach(q => q.Dispose());
        }
예제 #15
0
        public void MultiConsumerPool()
        {
            var queues = new List <IFiber>();
            IChannel <string> channel = new QueueChannel <string>();

            //Init executing Fibers
            for (int i = 0; i < 10; i++)
            {
                void OnReceive(string message)
                {
                    var firstChar = message[0];
                }

                IFiber fiber = PoolFiber.StartNew();
                queues.Add(fiber);
                channel.Subscribe(fiber, OnReceive);
            }
            Stopwatch sw = new Stopwatch();

            sw.Start();

            //Push messages
            for (int i = 0; i < 1000000; i++)
            {
                string msg = "[" + i + "] Push";
                channel.Publish(msg);
            }
            sw.Stop();
            Console.WriteLine("End : " + sw.ElapsedMilliseconds);

            //#Results:
            //1 ThreadFiber ~= 1sec
            //2 ThreadFiber ~=> 3sec
            //3 ThreadFiber ~=> 5sec
            //4 ThreadFiber ~=> 8sec
            //5 ThreadFiber ~=> 10sec
        }
예제 #16
0
        public void Multiple()
        {
            var queues       = new List <IFiber>();
            int receiveCount = 0;

            using (var reset = new AutoResetEvent(false))
            {
                var       channel      = new QueueChannel <int>();
                const int MessageCount = 100;
                var       updateLock   = new object();
                for (int i = 0; i < 5; i++)
                {
                    void OnReceive(int obj)
                    {
                        Thread.Sleep(15);
                        lock (updateLock)
                        {
                            receiveCount++;
                            if (receiveCount == MessageCount)
                            {
                                reset.Set();
                            }
                        }
                    }

                    IFiber fiber = PoolFiber.StartNew();
                    queues.Add(fiber);
                    channel.Subscribe(fiber, OnReceive);
                }
                for (int i = 0; i < MessageCount; i++)
                {
                    channel.Publish(i);
                }
                Assert.IsTrue(reset.WaitOne(10000, false));
                queues.ForEach(q => q.Dispose());
            }
        }
예제 #17
0
        public void Multiple()
        {
            var queues       = new List <IFiber>();
            var receiveCount = 0;
            var reset        = new AutoResetEvent(false);
            var channel      = new QueueChannel <int>();

            var messageCount = 100;
            var updateLock   = new object();

            for (var i = 0; i < 5; i++)
            {
                Action <int> onReceive = delegate
                {
                    Thread.Sleep(15);
                    lock (updateLock)
                    {
                        receiveCount++;
                        if (receiveCount == messageCount)
                        {
                            reset.Set();
                        }
                    }
                };
                var fiber = new PoolFiber();
                fiber.Start();
                queues.Add(fiber);
                channel.Subscribe(fiber, onReceive);
            }
            for (var i = 0; i < messageCount; i++)
            {
                channel.Publish(i);
            }
            Assert.IsTrue(reset.WaitOne(10000, false));
            queues.ForEach(delegate(IFiber q) { q.Dispose(); });
        }
예제 #18
0
 public void SingleConsumerWithException()
 {
     var exec = new StubExecutor();
     var one = new PoolFiber(new DefaultThreadPool(), exec);
     one.Start();
     var reset = new AutoResetEvent(false);
     using (one)
     {
         var channel = new QueueChannel<int>();
         Action<int> onMessage = delegate(int num)
         {
             if (num == 0)
             {
                 throw new Exception();
             }
             reset.Set();
         };
         channel.Subscribe(one, onMessage);
         channel.Publish(0);
         channel.Publish(1);
         Assert.IsTrue(reset.WaitOne(10000, false));
         Assert.AreEqual(1, exec.failed.Count);
     }
 }
예제 #19
0
 public void Multiple()
 {
     var queues = new List<IFiber>();
     int receiveCount = 0;
     using (var reset = new AutoResetEvent(false))
     {
         var channel = new QueueChannel<int>();
         const int MessageCount = 100;
         var updateLock = new object();
         for (int i = 0; i < 5; i++)
         {
             Action<int> onReceive = delegate
             {
                 Thread.Sleep(15);
                 lock (updateLock)
                 {
                     receiveCount++;
                     if (receiveCount == MessageCount)
                         reset.Set();
                 }
             };
             IFiber fiber = PoolFiber.StartNew();
             queues.Add(fiber);
             channel.Subscribe(fiber, onReceive);
         }
         for (int i = 0; i < MessageCount; i++)
             channel.Publish(i);
         Assert.IsTrue(reset.WaitOne(10000, false));
         queues.ForEach(q => q.Dispose());
     }
 }
예제 #20
0
 public void SingleConsumer()
 {
     int oneConsumed = 0;
     using (IFiber one = PoolFiber.StartNew())
     using (var reset = new AutoResetEvent(false))
     {
         var channel = new QueueChannel<int>();
         Action<int> onMsg = obj =>
         {
             oneConsumed++;
             if (oneConsumed == 20)
                 reset.Set();
         };
         channel.Subscribe(one, onMsg);
         for (int i = 0; i < 20; i++)
             channel.Publish(i);
         Assert.IsTrue(reset.WaitOne(10000, false));
     }
 }
예제 #21
0
 public void SingleConsumerWithException()
 {
     var failed = new List<Exception>();
     var exec = new ExceptionHandlingExecutor(failed.Add);
     using (IFiber one = PoolFiber.StartNew(exec))
     using (var reset = new AutoResetEvent(false))
     {
         var channel = new QueueChannel<int>();
         Action<int> onMsg = num =>
         {
             if (num == 0)
                 throw new Exception();
             reset.Set();
         };
         channel.Subscribe(one, onMsg);
         channel.Publish(0);
         channel.Publish(1);
         Assert.IsTrue(reset.WaitOne(10000, false));
         Assert.AreEqual(1, failed.Count);
     }
 }