Ejemplo n.º 1
0
        public static void EjecutarEsclavos(int cantidadDeEsclavos)
        {
            Program.NumeroDeEsclavos = cantidadDeEsclavos;
            SenalEsclavosListos      = new Semaphore(0, cantidadDeEsclavos);

            if (Debug.Listeners.Count == 0)
            {
                Debug.Listeners.Add(new ConsoleTraceListener());
            }

            // Crear contexto
            using (var ctx = new Context())
            {
                // Por cada esclavo:
                Debug.WriteLine("for (int i = 0; i < {0}; i++)", cantidadDeEsclavos);
                Debug.Indent();
                var tasks = new Task[cantidadDeEsclavos];
                for (int i = 0; i < cantidadDeEsclavos; i++)
                {
                    // Crear socket de envio (PUSH)
                    Socket socketEnvio  = ctx.Socket(SocketType.PUSH);
                    uint   PUERTO_ENVIO = ProgramHelper.PUERTO_ENVIO_ESCLAVO;
                    socketEnvio.Connect(Transport.TCP, "localhost", PUERTO_ENVIO);

                    // Crear socket de recepcion (SUBSCRIBER)
                    uint   PUERTO_RECEPCION = ProgramHelper.PUERTO_RECEPCION_ESCLAVO;
                    Socket socketRecepcion  = ctx.Socket(SocketType.SUB);
                    socketRecepcion.Connect(Transport.TCP, "localhost", PUERTO_RECEPCION);
                    socketRecepcion.Subscribe(new byte[] { });

                    // Inicializar objeto esclavo
                    var esclavo = new SumadorBroadcastEsclavo(i, cantidadDeEsclavos, socketEnvio, socketRecepcion);
                    int indice  = i;

                    // Inicializar sumatoria
                    Action task = () =>
                    {
                        using (esclavo)
                        {
                            Debug.WriteLine("Ejecutando operacion en esclavo {0}", indice);
                            SenalEsclavosListos.Release(1);
                            esclavo.EjecutarOperacion();
                        }
                    };

                    tasks[i] = Task.Factory.StartNew(task);
                    Thread.Sleep(5);
                }

                Debug.Unindent();
                // Esperar a que terminen los esclavos
                Task.WaitAll(tasks);
                // Fin.
            }
        }
        public void TestIfItCanSumItsRange()
        {
            // Arrange
            using (var context = new Context())
            {
                using (var masterSend = context.Socket(SocketType.PUB))
                    using (var masterRecv = context.Socket(SocketType.PULL))
                    {
                        masterRecv.Bind(Transport.TCP, BIND_HOSTNAME, TEST_PORT);
                        masterSend.Bind(Transport.TCP, BIND_HOSTNAME, TEST_PORT + 1);

                        var slaveRecv = context.Socket(SocketType.SUB);
                        slaveRecv.Connect(Transport.TCP, CONNECT_HOSTNAME, TEST_PORT + 1);
                        slaveRecv.Subscribe(new byte[] { });

                        var slaveSend = context.Socket(SocketType.PUSH);
                        slaveSend.Connect(Transport.TCP, CONNECT_HOSTNAME, TEST_PORT);


                        // Act
                        using (SumadorBroadcastEsclavo target = new SumadorBroadcastEsclavo(1, 3, slaveSend, slaveRecv))
                        {
                            var task = Task.Factory.StartNew(() =>
                            {
                                target.EjecutarOperacion();
                            });

                            Thread.Sleep(10);
                            int[] numeros = new int[] { 1, 2, 4, 8, 16, 32, 64, 128 };

                            Thread.Sleep(10);
                            masterSend.Send(numeros);
                            double resultado = masterRecv.Recv <double>();

                            // Assert
                            Assert.That(resultado, Is.EqualTo(4 + 8));
                            Assert.That(target.Resultado, Is.EqualTo(resultado));

                            // Reset
                        }
                    }
            }
        }