Skip to content

Instantly share code, notes, and snippets.

@clayg
Last active November 19, 2020 18:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save clayg/53d35d9636ac12831896ae106a03dc83 to your computer and use it in GitHub Desktop.
Save clayg/53d35d9636ac12831896ae106a03dc83 to your computer and use it in GitHub Desktop.
i have no idea what i'm doing
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