def test_multithreaded_runner_with_multiapp_system(self): system = System( Orders | Reservations | Orders, Orders | Payments | Orders, setup_tables=True, infrastructure_class=self.infrastructure_class, ) self.set_db_uri() with MultiThreadedRunner(system) as runner: orders = runner.get(Orders) started = time() # Create new orders. num_orders = 10 order_ids = [] for i in range(num_orders): order_id = create_new_order() order_ids.append(order_id) retries = num_orders for order_id in order_ids: # while not orders.repository[order_id].is_reserved: # sleep(0.1) # retries -= 1 # assert retries, "Failed set order.is_reserved" while not orders.repository[order_id].is_paid: sleep(0.5) retries -= 1 assert retries, "Failed set order.is_paid" print(f"Duration: { time() - started :.4f}s")
def test_multithreaded_runner_with_singleapp_system(self): system = System( Examples | Examples, setup_tables=True, infrastructure_class=self.infrastructure_class, ) self.set_db_uri() with MultiThreadedRunner(system) as runner: app = runner.get(Examples) aggregate = ExampleAggregate.__create__() aggregate.__save__() assert aggregate.id in app.repository # Check the aggregate is moved on. retries = 50 while not app.repository[aggregate.id].is_moved_on: sleep(0.1) retries -= 1 assert retries, "Failed to move"
def test_multithreaded_runner_with_single_pipe(self): system = System( Orders | Reservations, setup_tables=True, infrastructure_class=self.infrastructure_class, ) self.set_db_uri() # with system as runner: with MultiThreadedRunner(system) as runner: order_id = create_new_order() orders_repo = runner.get(Orders).repository self.assertEqual(orders_repo[order_id].id, order_id) reservations_repo = runner.get(Reservations).repository reservation_id = Reservation.create_reservation_id(order_id) patience = 10 while True: try: self.assertEqual( reservations_repo[reservation_id].order_id, order_id ) except (RepositoryKeyError, AssertionError): if patience: patience -= 1 sleep(0.1) else: raise else: break
def test_multithreaded_runner_with_single_application_class(self): system = System( Orders, setup_tables=True, infrastructure_class=self.infrastructure_class, ) with MultiThreadedRunner(system) as runner: app = runner.get(Orders) order_id = app.create_new_order() repository = app.repository self.assertEqual(repository[order_id].id, order_id)
def test_multi_threaded(self): if "TRAVIS_PYTHON_VERSION" in os.environ: if self.infrastructure_class is SQLAlchemyApplication: self.skipTest( "There's an intermittent problem with the multi-threaded" "runner with SQLAlchemy and Python 3.7 on Travis. Fix me :)." ) set_db_uri() key1, key2, key3 = uuid4(), uuid4(), uuid4() value1, value2, value3 = 11111, 22222, 33333 runner = MultiThreadedRunner( system=self.system, infrastructure_class=self.infrastructure_class ) with runner: paxosapplication0 = runner.processes["paxosapplication0"] paxosapplication1 = runner.processes["paxosapplication1"] paxosapplication2 = runner.processes["paxosapplication2"] started1 = datetime.datetime.now() assert isinstance(paxosapplication0, PaxosApplication) paxosapplication0.propose_value(key1, value1) ended1 = (datetime.datetime.now() - started1).total_seconds() # Check each process has expected final value. self.assert_final_value(paxosapplication0, key1, value1) self.assert_final_value(paxosapplication1, key1, value1) self.assert_final_value(paxosapplication2, key1, value1) print("Resolved paxos 1 with multi threads in %ss" % ended1) started2 = datetime.datetime.now() paxosapplication1.propose_value(key2, value2) ended2 = (datetime.datetime.now() - started2).total_seconds() # Check each process has a resolution. self.assert_final_value(paxosapplication0, key2, value2) self.assert_final_value(paxosapplication1, key2, value2) self.assert_final_value(paxosapplication2, key2, value2) print("Resolved paxos 2 with multi threads in %ss" % ended2) started3 = datetime.datetime.now() paxosapplication2.propose_value(key3, value3) ended3 = (datetime.datetime.now() - started3).total_seconds() # Check each process has a resolution. self.assert_final_value(paxosapplication0, key3, value3) self.assert_final_value(paxosapplication1, key3, value3) self.assert_final_value(paxosapplication2, key3, value3) print("Resolved paxos 3 with multi threads in %ss" % ended3)
def test_clocked_multithreaded_runner_with_multiapp_system(self): system = System( Orders | Reservations | Orders, Orders | Payments | Orders, setup_tables=True, infrastructure_class=self.infrastructure_class, ) self.set_db_uri() clock_speed = 10 with MultiThreadedRunner(system, clock_speed=clock_speed) as runner: started = time() # Create a new order. num_orders = 10 order_ids = [] for i in range(num_orders): order_id = create_new_order() order_ids.append(order_id) # sleep(tick_interval / 3) # sleep(tick_interval ) retries = 30 * num_orders num_completed = 0 for order_id in order_ids: app = runner.get(Orders) while not app.repository[order_id].is_paid: sleep(0.1) retries -= 1 assert retries, ( "Failed set order.is_paid (after %s completed)" % num_completed ) num_completed += 1 print(f"Duration: { time() - started :.4f}s")