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 } } } }