Message294572
Having the Event as the way to synchronize 1:N coroutines, the none happy path should be able to be expressed making possible call the `set_exception` for each future related to each waiter.
As an example the following code trying to implement a way to avoid the dogpile effect for a DNS cache. If the coro that holds the event fails, the original exception is also broadcasted to the waiters.
if key in throttle_dns_events:
yield from throttle_dns_events[key].wait()
else:
throttle_dns_events[key] = Event(loop=loop)
try:
addrs = yield from \
resolver.resolve(host, port, family=family)
cached_hosts.add(key, addrs)
throttle_dns_events[key].set()
except Exception as e:
# any DNS exception, independently of the implementation
# is set for the waiters to raise the same exception.
throttle_dns_events[key].set(exc=e)
raise
finally:
throttle_dns_events.pop(key) |
|
Date |
User |
Action |
Args |
2017-05-26 20:59:34 | pfreixes | set | recipients:
+ pfreixes, yselivanov |
2017-05-26 20:59:34 | pfreixes | set | messageid: <1495832374.38.0.182460539379.issue30490@psf.upfronthosting.co.za> |
2017-05-26 20:59:34 | pfreixes | link | issue30490 messages |
2017-05-26 20:59:34 | pfreixes | create | |
|