コード例 #1
0
        public async Task StartAsync(
            [PerperModuleTrigger(RunOnStartup = true)] PerperModuleContext context,
            CancellationToken cancellationToken,
            ILogger logger)
        {
            logger.LogInformation("Started Perper Structure sample application...");

            var pingInputStream  = context.DeclareStream(typeof(InputProviderStream));
            var pingOutputStream = await context.StartChildModuleAsync <IPerperStream>("ping", new { input = pingInputStream }, cancellationToken);

            var pongInputStream  = context.DeclareStream(typeof(InputProviderStream));
            var pongOutputStream = await context.StartChildModuleAsync <IPerperStream>("pong", new { input = pongInputStream }, cancellationToken);

            await context.StreamFunctionAsync(pingInputStream, new { input = pongOutputStream });

            await context.StreamFunctionAsync(pongInputStream, new { input = pingOutputStream });

            await context.StreamActionAsync(typeof(EnvironmentMonitorStream),
                                            new
            {
                agentPingOutput = pingOutputStream.Subscribe(),
                agentPongOutput = pongOutputStream.Subscribe()
            });
        }
コード例 #2
0
ファイル: Launcher.cs プロジェクト: sbnair/perper
        public async Task Run([PerperModuleTrigger(RunOnStartup = true)] PerperModuleContext context,
                              CancellationToken cancellationToken)
        {
            var streams = new List <IPerperStream>();

            for (var i = 0; i < NodeCount; i++)
            {
                var stream = context.DeclareStream("Node-" + i, typeof(Node), typeof(Message));
                streams.Add(stream);
            }

            var peering = await context.StreamFunctionAsync("Peering", typeof(Peering), new
            {
                streams = streams.ToArray()
            }, typeof(Message));

            var dummy = await context.StreamFunctionAsync("DummyInput", "Dummy", new { }, typeof(Message));

            for (var i = 0; i < NodeCount; i++)
            {
                await context.StreamFunctionAsync(streams[i], new
                {
                    enumerated = (EnumerateMessages ? peering : dummy).Subscribe(),
                    filtered   = (FilterMessages ? peering : dummy).Filter("To", i).Subscribe(),
                    queried    = (QueryMessages ? streams.ToArray() : new IPerperStream[0] {
                    }),
                    i,
                    n = NodeCount,
                });
            }

            await context.StreamActionAsync("Dummy", new
            {
                peering = peering.Subscribe()
            });

            while (!NodesReady.IsMax())
            {
                await Task.Delay(100);
            }
            var columns = "| {0,10}";

            if (EnumerateMessages)
            {
                columns += " | {1,10}";
            }
            if (FilterMessages)
            {
                columns += " | {2,10}";
            }
            if (QueryMessages)
            {
                columns += " | {3,10}";
            }
            columns += " | {4,10} |";
            var stats   = new[] { MessagesSent.Read(), MessagesEnumerated.Read(), MessagesFiltered.Read(), MessagesQueried.Read(), MessagesProcessed.Read() };
            var seconds = 0;

            Console.WriteLine("Sending {0} messages between {1} nodes", MessagesSent.Max, NodesReady.Max);
            Console.WriteLine("Per-second values:");
            Console.WriteLine(columns, "Sent", "Enumerated", "Filtered", "Queried", "Processed");
            Console.WriteLine(columns, "-", "-", "-", "-", "-");
            while (true)
            {
                seconds += 1;
                cancellationToken.ThrowIfCancellationRequested();
                await Task.Delay(1000, cancellationToken);

                var values = stats.Select(x => (object)x.Advance()).ToArray();
                Console.WriteLine(columns, values);

                if ((long)values[4] == 0L)
                {
                    break; // Nothing processed in the last second, assume finished
                }
            }
            Console.WriteLine("Sent {0} messages between {1} nodes in roughly {2} seconds", MessagesSent.Get(), NodesReady.Get(), seconds);
        }