Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_pipelines_expose_completion_stats(stub_broker, stub_worker, result_backend):
# Given a result backend
# And a broker with the results middleware
stub_broker.add_middleware(Results(backend=result_backend))
# And an actor that waits some amount of time
condition = Condition()
@dramatiq.actor(store_results=True)
def wait(n):
time.sleep(n)
with condition:
condition.notify_all()
return n
# When I pipe some messages intended for that actor together and run the pipeline
pipe = wait.message(1) | wait.message()
pipe.run()
# Then every time a job in the pipeline completes, the completed_count should increase
def test_groups_execute_jobs_in_parallel(stub_broker, stub_worker, result_backend):
# Given that I have a result backend
stub_broker.add_middleware(Results(backend=result_backend))
# And I have an actor that sleeps for 100ms
@dramatiq.actor(store_results=True)
def wait():
time.sleep(0.1)
# When I group multiple of these actors together and run them
t = time.monotonic()
g = group([wait.message() for _ in range(5)])
g.run()
# And wait on the group to complete
results = list(g.get_results(block=True))
# Then the total elapsed time should be less than 500ms
assert time.monotonic() - t <= 0.5
def test_pipeline_results_respect_timeouts(stub_broker, stub_worker, result_backend):
# Given a result backend
# And a broker with the results middleware
stub_broker.add_middleware(Results(backend=result_backend))
# And an actor that waits some amount of time then doubles that amount
@dramatiq.actor(store_results=True)
def wait(n):
time.sleep(n)
return n * 2
# When I pipe some messages intended for that actor together and run the pipeline
pipe = wait.message(1) | wait.message() | wait.message()
pipe.run()
# And get the results with a lower timeout than the tasks can complete in
# Then a ResultTimeout error should be raised
with pytest.raises(ResultTimeout):
for _ in pipe.get_results(block=True, timeout=1000):
pass
def test_groups_can_time_out(stub_broker, stub_worker, result_backend):
# Given that I have a result backend
stub_broker.add_middleware(Results(backend=result_backend))
# And I have an actor that sleeps for 300ms
@dramatiq.actor(store_results=True)
def wait():
time.sleep(0.3)
# When I group a few jobs together and run it
g = group(wait.message() for _ in range(2))
g.run()
# And wait for the group to complete with a timeout
# Then a ResultTimeout error should be raised
with pytest.raises(ResultTimeout):
g.wait(timeout=100)
# And the group should not be completed
def test_groups_expose_completion_stats(stub_broker, stub_worker, result_backend):
# Given that I have a result backend
stub_broker.add_middleware(Results(backend=result_backend))
# And an actor that waits some amount of time
condition = Condition()
@dramatiq.actor(store_results=True)
def wait(n):
time.sleep(n)
with condition:
condition.notify_all()
return n
# When I group messages of varying durations together and run the group
g = group(wait.message(n) for n in range(1, 4))
g.run()
# Then every time a job in the group completes, the completed_count should increase
def test_groups_expose_completion_stats(stub_broker, stub_worker, result_backend):
# Given that I have a result backend
stub_broker.add_middleware(Results(backend=result_backend))
# And an actor that waits some amount of time
condition = Condition()
@dramatiq.actor(store_results=True)
def wait(n):
time.sleep(n)
with condition:
condition.notify_all()
return n
# When I group messages of varying durations together and run the group
g = group(wait.message(n) for n in range(1, 4))
g.run()
# Then every time a job in the group completes, the completed_count should increase
for count in range(1, len(g) + 1):
with condition:
condition.wait(5)
time.sleep(0.1) # give the worker time to set the result
assert g.completed_count == count
# Finally, completed should be true
assert g.completed
def test_groups_can_time_out(stub_broker, stub_worker, result_backend):
# Given that I have a result backend
stub_broker.add_middleware(Results(backend=result_backend))
# And I have an actor that sleeps for 300ms
@dramatiq.actor(store_results=True)
def wait():
time.sleep(0.3)
# When I group a few jobs together and run it
g = group(wait.message() for _ in range(2))
g.run()
# And wait for the group to complete with a timeout
# Then a ResultTimeout error should be raised
with pytest.raises(ResultTimeout):
g.wait(timeout=100)
# And the group should not be completed
assert not g.completed
def test_groups_execute_jobs_in_parallel(stub_broker, stub_worker, result_backend):
# Given that I have a result backend
stub_broker.add_middleware(Results(backend=result_backend))
# And I have an actor that sleeps for 100ms
@dramatiq.actor(store_results=True)
def wait():
time.sleep(0.1)
# When I group multiple of these actors together and run them
t = time.monotonic()
g = group([wait.message() for _ in range(5)])
g.run()
# And wait on the group to complete
results = list(g.get_results(block=True))
# Then the total elapsed time should be less than 500ms
assert time.monotonic() - t <= 0.5
# And I should get back as many results as there were jobs in the group
assert len(results) == len(g)
# And the group should be completed
assert g.completed
def test_groups_execute_inner_groups(stub_broker, stub_worker, result_backend):
# Given that I have a result backend
stub_broker.add_middleware(Results(backend=result_backend))
# And I have an actor that sleeps for 100ms
@dramatiq.actor(store_results=True)
def wait():
time.sleep(0.1)
# When I group multiple groups inside one group and run it
t = time.monotonic()
g = group(group(wait.message() for _ in range(2)) for _ in range(3))
g.run()
# And wait on the group to complete
results = list(g.get_results(block=True))
# Then the total elapsed time should be less than 500ms
assert time.monotonic() - t <= 0.5
# And I should get back 3 results each with 2 results inside it
assert results == [[None, None]] * 3
# And the group should be completed
assert g.completed
@dramatiq.actor(max_retries=0)
def do_work():
raise RuntimeError("failed")