Skip to content

Instantly share code, notes, and snippets.

@DadgadCafe
Created June 22, 2017 15:10
Show Gist options
  • Save DadgadCafe/5cdef2e8c108c4799f3b0c95f28774c0 to your computer and use it in GitHub Desktop.
Save DadgadCafe/5cdef2e8c108c4799f3b0c95f28774c0 to your computer and use it in GitHub Desktop.
naive async flow like node, using promise
import signal
# broken in eventloop things
class Promise:
def __init__(self, f):
self.status = 'PENDING'
self.cb = None
f(self.__resolve)
def resolve(v):
if isinstance(v, Promise):
return v
else:
return Promise(lambda res:res(v))
def __resolve(self, v):
self.status = 'RESOLVED'
if self.cb:
Promise.resolve(self.cb(v))
else:
self.value = v
def then(self, cb):
if self.status == 'PENDING':
self.cb = cb
else:
return Promise.resolve(cb(self.value))
def run(gen, v=None):
try:
ret = gen.send(v)
ret.then(lambda res: run(gen, res))
except StopIteration as e:
print('gen done')
def sleep(n):
def f(resolve):
signal.signal(signal.SIGALRM, lambda signum, frame: resolve('wake up'))
signal.setitimer(signal.ITIMER_REAL, n)
return Promise(f)
def fakeAjax():
ret = yield sleep(1)
print(f'after sleep1: {ret}')
ret2 = yield sleep(1)
print(f'after sleep2: {ret2}')
if name == '__main__':
run(fakeAjax())
print('first one')
# first one
# after sleep1: wake up
# after sleep2: wake up
# gen done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment