i have no idea what i'm doing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from swift.common.utils import Watchdog, WatchdogTimeout, GreenAsyncPile | |
from eventlet.greenthread import spawn | |
from eventlet import sleep, Timeout | |
import random | |
watchdog = Watchdog() | |
watchdog.spawn() | |
def range_iter(start=0): | |
try: | |
for i in range(start, 10): | |
if random.random() > 0.8: | |
sleep(1.1) | |
else: | |
sleep(0.1) | |
yield i | |
except GeneratorExit: | |
print('shutting down range_iter: %s' % start) | |
raise | |
def exploder(g, n=4): | |
count = 0 | |
for chunk in g: | |
yield chunk | |
count += 1 | |
if count >= n: | |
raise ValueError('ChunkBad') | |
class BackendIter(object): | |
def __init__(self, start=0, n=4): | |
self.inner_iter = range_iter(start=start) | |
self.n = n | |
self._iter = None | |
def __iter__(self): | |
return self | |
def __next__(self): | |
if not self._iter: | |
self._iter = exploder(self.inner_iter, n=self.n) | |
with WatchdogTimeout(watchdog, 1.0, Timeout): | |
return spawn(next, self._iter).wait() | |
next = __next__ | |
def close(self): | |
self.inner_iter.close() | |
def resume_iter(): | |
backend = BackendIter() | |
count = 0 | |
while True: | |
try: | |
with WatchdogTimeout(watchdog, 1.0, Timeout): | |
yield spawn(next, backend).wait() | |
count += 1 | |
except (Timeout, ValueError): | |
# WTF is ValueError: generator already executing?! | |
# backend.close() | |
print('resume at %s' % count) | |
backend = BackendIter(start=count, n=2) | |
except StopIteration: | |
raise | |
def handle_one_request(): | |
g = resume_iter() | |
try: | |
try: | |
count = 0 | |
for chunk in g: | |
print(chunk) | |
count += 1 | |
if count < 9: | |
raise ValueError('BadLength') | |
finally: | |
resp = 'all good.' | |
except StopIteration: | |
resp = 'smoking gun!' | |
return resp | |
req_count = 10 | |
p = GreenAsyncPile(req_count) | |
for i in range(req_count): | |
p.spawn(handle_one_request) | |
responses = [] | |
for resp in p: | |
responses.append(resp) | |
print('num_responses: %s' % len(responses)) | |
for resp in responses: | |
print(resp) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment