Beispiel #1
0
        private async Task <List <Task> > ResolvePending(List <Task> pending, IndexingReport report, bool all = false)
        {
            try
            {
                await(all ? Task.WhenAll(pending) : Task.WhenAny(pending));
            }
            catch (Exception) { }

            List <Task> remaining = new List <Task>();

            foreach (Task t in pending)
            {
                if (t.IsFaulted || t.IsCanceled)
                {
                    report.Failed++;
                }
                else if (t.IsCompleted)
                {
                    report.Succeeded++;
                }
                else
                {
                    remaining.Add(t);
                }
            }
            return(remaining);
        }
        public async Task <IndexingReport> RunAsync(int run, int grainsPerRunner, int concurrentPerRun)
        {
            var load = this.host.Client.GetGrain <IIndexingLoadGrain <TGrainInterface> >(Guid.NewGuid());
            await load.Generate(run, grainsPerRunner, this.indexingParams.NumProperties, concurrentPerRun);

            IndexingReport report = null;

            while (report == null)
            {
                await Task.Delay(TimeSpan.FromSeconds(10));

                report = await load.TryGetReport();
            }
            return(report);
        }
        private async Task FullRunAsync()
        {
            int runners         = Math.Max(1, (int)Math.Sqrt(this.indexingParams.NumConcurrentGrains));
            int grainsPerRunner = Math.Max(1, this.indexingParams.NumGrains / runners);

            IndexingReport[] reports = await Task.WhenAll(Enumerable.Range(0, runners).Select(i => RunAsync(i, grainsPerRunner, runners)));

            var finalReport = new IndexingReport();

            foreach (var report in reports)
            {
                finalReport.Succeeded += report.Succeeded;
                finalReport.Failed    += report.Failed;
                finalReport.Elapsed    = TimeSpan.FromMilliseconds(Math.Max(finalReport.Elapsed.TotalMilliseconds, report.Elapsed.TotalMilliseconds));
            }
            Console.WriteLine($"{finalReport.Succeeded} grains" +
                              $" ({this.indexingParams.NumProperties} indexed propert{(this.indexingParams.NumProperties == 1 ? "y" : "ies")} per grain)" +
                              $" in {finalReport.Elapsed.TotalMilliseconds}ms.");
            Console.WriteLine($"{(int)(finalReport.Succeeded * 1000 / finalReport.Elapsed.TotalMilliseconds)} grains per second.");
            Console.WriteLine(finalReport.Failed > 0 ? $"{finalReport.Failed} grains failed!!" : "All grains succeeded.");
        }
Beispiel #4
0
        private async Task <IndexingReport> RunGeneration(int run, int numGrainsPerRunner, int numPropertiesPerGrain, int concurrentGrainsPerRun)
        {
            var pending   = new List <Task>();
            var report    = new IndexingReport();
            var sw        = Stopwatch.StartNew();
            var generated = run * numGrainsPerRunner;   // For producing grain IDs as well as loop variables
            var max       = generated + numGrainsPerRunner;

            while (generated < max)
            {
                while (generated < max && pending.Count < concurrentGrainsPerRun)
                {
                    pending.Add(this.StartIndexingTasks(generated++, numPropertiesPerGrain));
                }
                pending = await this.ResolvePending(pending, report);
            }
            await this.ResolvePending(pending, report, true);

            sw.Stop();
            report.Elapsed = sw.Elapsed;
            return(report);
        }