Created
June 22, 2017 15:10
-
-
Save DadgadCafe/5cdef2e8c108c4799f3b0c95f28774c0 to your computer and use it in GitHub Desktop.
naive async flow like node, using promise
This file contains hidden or 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
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