def result_status(url): """Deferred results can be queried for task status. A lock is used to control state interactions between the producer and the worker for illustration purposes only. This type of lock-step interaction is not normally needed or even desired. """ lock = TimeoutLock(locked=True) def func(arg): lock.acquire() return arg broker = get_broker(url) broker.expose(func) with thread_worker(broker, lock): # -- task-invoking code, usually another process -- q = get_queue(url) res = q.func('arg') eventually((lambda:res.status), const.ENQUEUED) eq_(repr(res), "<Deferred func [default:%s] enqueued>" % res.id) lock.release() eventually((lambda:res.status), const.PROCESSING) eq_(repr(res), "<Deferred func [default:%s] processing>" % res.id) lock.release() assert res.wait(WAIT), repr(res) eq_(repr(res), "<Deferred func [default:%s] success>" % res.id) eq_(res.value, 'arg')
def result_status(url): """Deferred results can be queried for task status. A lock is used to control state interactions between the producer and the worker for illustration purposes only. This type of lock-step interaction is not normally needed or even desired. """ lock = TimeoutLock(locked=True) def func(arg): lock.acquire() return arg broker = get_broker(url) broker.expose(func) with thread_worker(broker, lock): # -- task-invoking code, usually another process -- q = get_queue(url) res = q.func('arg') eventually((lambda: res.status), const.ENQUEUED) eq_(repr(res), "<Deferred func [default:%s] enqueued>" % res.id) lock.release() eventually((lambda: res.status), const.PROCESSING) eq_(repr(res), "<Deferred func [default:%s] processing>" % res.id) lock.release() assert res.wait(WAIT), repr(res) eq_(repr(res), "<Deferred func [default:%s] success>" % res.id) eq_(res.value, 'arg')
def test_Broker_task_failed(url): lock = TimeoutLock(locked=True) def func(): lock.acquire() broker = get_broker(url) broker.expose(func) with thread_worker(broker): q = get_queue(url) res = q.func() broker.task_failed(res) assert res.wait(timeout=WAIT), repr(res) lock.release() with assert_raises(TaskExpired): res.value
def test_Queue_len(url): lock = TimeoutLock(locked=True) def func(arg=None): pass broker = get_broker(url) broker.expose(func) with thread_worker(broker, lock): q = get_queue(url) eq_(len(q), 0) r0 = q.func() eq_(len(q), 1) r1 = q.func() r2 = q.func(r1) eq_(len(q), 3) eventually((lambda:lock.locked), True) lock.release() assert r0.wait(timeout=WAIT), repr(r0) eq_(len(q), 2) eventually((lambda:lock.locked), True) lock.release() eventually((lambda:lock.locked), True) lock.release() assert r2.wait(timeout=WAIT), repr(r2) eq_(len(q), 0)
def test_Queue_len(url): lock = TimeoutLock(locked=True) def func(arg=None): pass broker = get_broker(url) broker.expose(func) with thread_worker(broker, lock): q = get_queue(url) eq_(len(q), 0) r0 = q.func() eq_(len(q), 1) r1 = q.func() r2 = q.func(r1) eq_(len(q), 3) eventually((lambda: lock.locked), True) lock.release() assert r0.wait(timeout=WAIT), repr(r0) eq_(len(q), 2) eventually((lambda: lock.locked), True) lock.release() eventually((lambda: lock.locked), True) lock.release() assert r2.wait(timeout=WAIT), repr(r2) eq_(len(q), 0)
def Broker_duplicate_task_id(url, identifier): lock = TimeoutLock(locked=True) state = [] def func(arg): lock.acquire() return arg broker = get_broker(url) broker.expose(func) with thread_worker(broker, lock): q = get_queue(url) task = Task(q.func, id=identifier) res = task(1) eventually((lambda:res.status), const.ENQUEUED) msg = 'func [default:int] cannot enqueue task with duplicate id' with assert_raises(DuplicateTask, msg): task(2) lock.release() eventually((lambda:res.status), const.PROCESSING) msg = 'func [default:int] cannot enqueue task with duplicate id' with assert_raises(DuplicateTask, msg): task(3) lock.release() assert res.wait(timeout=WAIT), repr(res) eq_(res.value, 1) res = task(4) eventually((lambda:res.status), const.ENQUEUED) lock.release() eventually((lambda:res.status), const.PROCESSING) lock.release() assert res.wait(timeout=WAIT), repr(res) eq_(res.value, 4)
def Broker_duplicate_task_id(url, identifier): lock = TimeoutLock(locked=True) state = [] def func(arg): lock.acquire() return arg broker = get_broker(url) broker.expose(func) with thread_worker(broker, lock): q = get_queue(url) task = Task(q.func, id=identifier) res = task(1) eventually((lambda: res.status), const.ENQUEUED) msg = 'func [default:int] cannot enqueue task with duplicate id' with assert_raises(DuplicateTask, msg): task(2) lock.release() eventually((lambda: res.status), const.PROCESSING) msg = 'func [default:int] cannot enqueue task with duplicate id' with assert_raises(DuplicateTask, msg): task(3) lock.release() assert res.wait(timeout=WAIT), repr(res) eq_(res.value, 1) res = task(4) eventually((lambda: res.status), const.ENQUEUED) lock.release() eventually((lambda: res.status), const.PROCESSING) lock.release() assert res.wait(timeout=WAIT), repr(res) eq_(res.value, 4)