public void Producer_consumer() { using (var pool = ConnectionPool.GetPool(TestConfig.Host, TestConfig.Port)) { var tube = Guid.NewGuid().ToString(); var produced = new List <string>(); var consumed = new List <string>(); var n = 10000; var producerTimer = new Stopwatch(); var producer = new Thread(() => { Console.WriteLine("producer started"); using (var producerClient = new BeanstalkClient(pool)) { producerClient.CurrentTube = tube; Console.WriteLine("producing into tube '{0}'", producerClient.CurrentTube); producerTimer.Start(); for (var i = 0; i < n; i++) { var data = Guid.NewGuid().ToString(); produced.Add(data); producerClient.PutString(data); if (i % 2000 == 0) { Console.WriteLine("enqueued {0} @ {1:0} items/sec", i, i / producerTimer.Elapsed.TotalSeconds); } } producerTimer.Stop(); Console.WriteLine("done producing"); } }); producer.Start(); Thread.Sleep(2000); var consumerTimer = new Stopwatch(); Console.WriteLine("consumer started"); using (var consumerClient = new BeanstalkClient(pool)) { consumerClient.WatchedTubes.Add(tube); consumerClient.WatchedTubes.Remove(BeanstalkClient.DEFAULT_TUBE); Console.WriteLine("consuming from tube '{0}'", tube); consumerTimer.Start(); while (consumed.Count < n) { var job = consumerClient.ReserveString(TimeSpan.Zero); consumed.Add(job.Data); consumerClient.Delete(job.JobId); if (consumed.Count % 2000 == 0) { Console.WriteLine("dequeued {0} @ {1:0} items/sec", consumed.Count, consumed.Count / consumerTimer.Elapsed.TotalSeconds); } } consumerTimer.Stop(); Console.WriteLine("done consuming"); } producer.Join(); Assert.AreEqual(n, produced.Count, "wrong number of produced items"); Assert.AreEqual(n, consumed.Count, "wrong number of consumed items"); Assert.AreEqual(produced.OrderBy(x => x).ToArray(), consumed.OrderBy(x => x).ToArray()); Console.WriteLine("final enqueue: {0:0} items/sec", n / producerTimer.Elapsed.TotalSeconds); Console.WriteLine("final dequeue: {0:0} items/sec", n / consumerTimer.Elapsed.TotalSeconds); } }
public void Producer_consumer() { using(var pool = ConnectionPool.GetPool(TestConfig.Host, TestConfig.Port)) { var tube = Guid.NewGuid().ToString(); var produced = new List<string>(); var consumed = new List<string>(); var n = 10000; var producerTimer = new Stopwatch(); var producer = new Thread(() => { Console.WriteLine("producer started"); using(var producerClient = new BeanstalkClient(pool)) { producerClient.CurrentTube = tube; Console.WriteLine("producing into tube '{0}'", producerClient.CurrentTube); producerTimer.Start(); for(var i = 0; i < n; i++) { var data = Guid.NewGuid().ToString(); produced.Add(data); producerClient.PutString(data); if(i % 2000 == 0) { Console.WriteLine("enqueued {0} @ {1:0} items/sec", i, i / producerTimer.Elapsed.TotalSeconds); } } producerTimer.Stop(); Console.WriteLine("done producing"); } }); producer.Start(); Thread.Sleep(2000); var consumerTimer = new Stopwatch(); Console.WriteLine("consumer started"); using(var consumerClient = new BeanstalkClient(pool)) { consumerClient.WatchedTubes.Add(tube); consumerClient.WatchedTubes.Remove(BeanstalkClient.DEFAULT_TUBE); Console.WriteLine("consuming from tube '{0}'", tube); consumerTimer.Start(); while(consumed.Count < n) { var job = consumerClient.ReserveString(TimeSpan.Zero); consumed.Add(job.Data); consumerClient.Delete(job.JobId); if(consumed.Count % 2000 == 0) { Console.WriteLine("dequeued {0} @ {1:0} items/sec", consumed.Count, consumed.Count / consumerTimer.Elapsed.TotalSeconds); } } consumerTimer.Stop(); Console.WriteLine("done consuming"); } producer.Join(); Assert.AreEqual(n, produced.Count, "wrong number of produced items"); Assert.AreEqual(n, consumed.Count, "wrong number of consumed items"); Assert.AreEqual(produced.OrderBy(x => x).ToArray(), consumed.OrderBy(x => x).ToArray()); Console.WriteLine("final enqueue: {0:0} items/sec", n / producerTimer.Elapsed.TotalSeconds); Console.WriteLine("final dequeue: {0:0} items/sec", n / consumerTimer.Elapsed.TotalSeconds); } }
public void Producer_consumer_load_test_runs_forever() { var pool = ConnectionPool.GetPool(TestConfig.Host, TestConfig.Port); var tube = "forever-" + Guid.NewGuid().ToString(); Console.WriteLine("using tube: {0}", tube); var set = 0; while(true) { set++; var produced = new List<string>(); var consumed = new List<string>(); var n = 10000; var producerTimer = new Stopwatch(); var producer = new Thread(() => { using(var producerClient = new BeanstalkClient(pool)) { producerClient.CurrentTube = tube; producerTimer.Start(); for(var i = 0; i < n; i++) { var data = Guid.NewGuid().ToString(); produced.Add(data); producerClient.PutString(data); } producerTimer.Stop(); } }); producer.Start(); Thread.Sleep(1000); var consumerTimer = new Stopwatch(); using(var consumerClient = new BeanstalkClient(pool)) { consumerClient.WatchedTubes.Add(tube); consumerClient.WatchedTubes.Remove(BeanstalkClient.DEFAULT_TUBE); consumerTimer.Start(); while(consumed.Count < n) { var job = consumerClient.ReserveString(TimeSpan.Zero); consumed.Add(job.Data); consumerClient.Delete(job.JobId); } consumerTimer.Stop(); } producer.Join(); Assert.AreEqual(n, produced.Count, "wrong number of produced items"); Assert.AreEqual(n, consumed.Count, "wrong number of consumed items"); Assert.AreEqual(produced.OrderBy(x => x).ToArray(), consumed.OrderBy(x => x).ToArray()); Console.WriteLine("set {0} enqueue/dequeue: {1:0}/{2:0} items/sec", set, n / producerTimer.Elapsed.TotalSeconds, n / consumerTimer.Elapsed.TotalSeconds ); using(var client = new BeanstalkClient(pool)) { foreach(var t in client.GetTubes()) { var tubeStats = client.GetTubeStats(t); Console.WriteLine("{0}:total:{1}/buried:{2}/delayed:{3}/ready:{4}/reserved:{5}/urgent:{6}/waiting:{7}", tubeStats.Name, tubeStats.TotalJobs, tubeStats.CurrentBuriedJobs, tubeStats.CurrentDelayedJobs, tubeStats.CurrentReadyJobs, tubeStats.CurrentReservedJobs, tubeStats.CurrentUrgentJobs, tubeStats.CurrentWaiting ); } } } }
public void Producer_consumer_load_test_runs_forever() { var pool = ConnectionPool.GetPool(TestConfig.Host, TestConfig.Port); var tube = "forever-" + Guid.NewGuid().ToString(); Console.WriteLine("using tube: {0}", tube); var set = 0; while (true) { set++; var produced = new List <string>(); var consumed = new List <string>(); var n = 10000; var producerTimer = new Stopwatch(); var producer = new Thread(() => { using (var producerClient = new BeanstalkClient(pool)) { producerClient.CurrentTube = tube; producerTimer.Start(); for (var i = 0; i < n; i++) { var data = Guid.NewGuid().ToString(); produced.Add(data); producerClient.PutString(data); } producerTimer.Stop(); } }); producer.Start(); Thread.Sleep(1000); var consumerTimer = new Stopwatch(); using (var consumerClient = new BeanstalkClient(pool)) { consumerClient.WatchedTubes.Add(tube); consumerClient.WatchedTubes.Remove(BeanstalkClient.DEFAULT_TUBE); consumerTimer.Start(); while (consumed.Count < n) { var job = consumerClient.ReserveString(TimeSpan.Zero); consumed.Add(job.Data); consumerClient.Delete(job.JobId); } consumerTimer.Stop(); } producer.Join(); Assert.AreEqual(n, produced.Count, "wrong number of produced items"); Assert.AreEqual(n, consumed.Count, "wrong number of consumed items"); Assert.AreEqual(produced.OrderBy(x => x).ToArray(), consumed.OrderBy(x => x).ToArray()); Console.WriteLine("set {0} enqueue/dequeue: {1:0}/{2:0} items/sec", set, n / producerTimer.Elapsed.TotalSeconds, n / consumerTimer.Elapsed.TotalSeconds ); using (var client = new BeanstalkClient(pool)) { foreach (var t in client.GetTubes()) { var tubeStats = client.GetTubeStats(t); Console.WriteLine("{0}:total:{1}/buried:{2}/delayed:{3}/ready:{4}/reserved:{5}/urgent:{6}/waiting:{7}", tubeStats.Name, tubeStats.TotalJobs, tubeStats.CurrentBuriedJobs, tubeStats.CurrentDelayedJobs, tubeStats.CurrentReadyJobs, tubeStats.CurrentReservedJobs, tubeStats.CurrentUrgentJobs, tubeStats.CurrentWaiting ); } } } }