@@ -42,13 +42,11 @@ def set_timer(self, duration):
42
42
def _execute (self , callback , * args ):
43
43
self ._time = hrtime ()
44
44
try :
45
- # unwind(callback(*args)).catch(
46
- # lambda e: print('Uncaught rejection:', e))
47
45
ret = callback (* args )
48
46
if is_generator (ret ):
49
- unwind2 (ret ,
50
- ok = lambda * _ : None ,
51
- fail = lambda e : print ('Uncaught rejection:' , e ))
47
+ unwind (ret ,
48
+ ok = lambda * _ : None ,
49
+ fail = lambda e : print ('Uncaught rejection:' , e ))
52
50
53
51
except Exception as err :
54
52
print ('Uncaught exception:' , err )
@@ -119,7 +117,7 @@ def evloop(self):
119
117
return self ._event_loop
120
118
121
119
122
- def unwind2 (gen , ok , fail , ret = None , method = 'send' ):
120
+ def unwind (gen , ok , fail , ret = None , method = 'send' ):
123
121
try :
124
122
ret = getattr (gen , method )(ret )
125
123
except StopIteration as stop :
@@ -128,16 +126,16 @@ def unwind2(gen, ok, fail, ret=None, method='send'):
128
126
return fail (e )
129
127
130
128
if is_generator (ret ):
131
- unwind2 (ret ,
132
- ok = lambda x : unwind2 (gen , ok , fail , x ),
133
- fail = lambda e : unwind2 (gen , ok , fail , e , 'throw' ))
129
+ unwind (ret ,
130
+ ok = lambda x : unwind (gen , ok , fail , x ),
131
+ fail = lambda e : unwind (gen , ok , fail , e , 'throw' ))
134
132
elif is_promise (ret ):
135
- ret .then (lambda x = None : unwind2 (gen , ok , fail , x )) \
136
- .catch (lambda e : unwind2 (gen , ok , fail , e , 'throw' ))
133
+ ret .then (lambda x = None : unwind (gen , ok , fail , x )) \
134
+ .catch (lambda e : unwind (gen , ok , fail , e , 'throw' ))
137
135
else :
138
- wait_all (ret ,
139
- lambda x = None : unwind2 (gen , ok , fail , x ),
140
- lambda e : unwind2 (gen , ok , fail , e , 'throw' ))
136
+ wait_all (ret ,
137
+ lambda x = None : unwind (gen , ok , fail , x ),
138
+ lambda e : unwind (gen , ok , fail , e , 'throw' ))
141
139
142
140
143
141
def wait_all (col , ok , fail ):
@@ -157,7 +155,7 @@ def _do_resolve(val):
157
155
158
156
for i , c in enumerate (col ):
159
157
if is_generator (c ):
160
- unwind2 (c , ok = _resolve_single (i ), fail = fail )
158
+ unwind (c , ok = _resolve_single (i ), fail = fail )
161
159
continue
162
160
163
161
if is_promise (c ):
@@ -168,59 +166,6 @@ def _do_resolve(val):
168
166
'can be yielded to event loop' )
169
167
170
168
171
- def unwind (gen ):
172
- p = Promise ()
173
- if not is_generator (gen ):
174
- p ._resolve (gen )
175
- return p
176
-
177
- def _on_fulfilled (res = None ):
178
- ret = None
179
- try :
180
- ret = gen .send (res )
181
- except StopIteration as stop :
182
- return p ._resolve (stop .value )
183
- except Exception as exc :
184
- return p ._reject (exc )
185
- _next (ret )
186
-
187
- def _on_rejected (err ):
188
- ret = None
189
- try :
190
- ret = gen .throw (err )
191
- except StopIteration as stop :
192
- return p ._resolve (stop .value )
193
- except Exception as exc :
194
- return p ._reject (exc )
195
- _next (ret )
196
-
197
- def _next (ret ):
198
- nextp = to_promise (ret )
199
- if not nextp :
200
- return _on_rejected (Exception ('Only promise or generator '
201
- 'can be yielded to event loop' ))
202
- nextp .then (_on_fulfilled )
203
- nextp .catch (_on_rejected )
204
-
205
- _on_fulfilled ()
206
- return p
207
-
208
-
209
- def to_promise (val ):
210
- if is_promise (val ):
211
- return val
212
-
213
- if is_generator (val ):
214
- return unwind (val )
215
-
216
- if isinstance (val , list ):
217
- promises = [to_promise (x ) for x in val ]
218
- if len (val ) == len (list (filter (None , promises ))):
219
- return Promise .all (promises )
220
-
221
- return None
222
-
223
-
224
169
def is_generator (val ):
225
170
return isinstance (val , types .GeneratorType )
226
171
@@ -293,7 +238,7 @@ def _reject(self, err):
293
238
self ._value = err
294
239
for cb in self ._on_reject :
295
240
cb (err )
296
-
241
+
297
242
298
243
class IOError (Exception ):
299
244
def __init__ (self , message , errorno , errorcode ):
@@ -322,7 +267,7 @@ def __init__(self, *args):
322
267
# 1 - connecting
323
268
# 2 - connected
324
269
# 3 - closed
325
- self ._state = 0
270
+ self ._state = 0
326
271
self ._callbacks = {}
327
272
328
273
def connect (self , addr ):
@@ -365,7 +310,7 @@ def _on_write_ready(err):
365
310
nonlocal data
366
311
if err :
367
312
return p ._reject (err )
368
-
313
+
369
314
n = self ._sock .send (data )
370
315
if n < len (data ):
371
316
data = data [n :]
@@ -408,11 +353,11 @@ def _on_event(self, mask):
408
353
cb (err )
409
354
410
355
def _get_sock_error (self ):
411
- err = self ._sock .getsockopt (_socket .SOL_SOCKET ,
356
+ err = self ._sock .getsockopt (_socket .SOL_SOCKET ,
412
357
_socket .SO_ERROR )
413
358
if not err :
414
359
return None
415
- return IOError ('connection failed' ,
360
+ return IOError ('connection failed' ,
416
361
err , errno .errorcode [err ])
417
362
418
363
###############################################################################
@@ -457,7 +402,7 @@ def print_balance(serv_addr, user_id):
457
402
print ('Catched:' , exc )
458
403
459
404
460
- def main (serv_addr ):
405
+ def main1 (serv_addr ):
461
406
def on_sleep ():
462
407
b = yield get_user_balance (serv_addr , 1 )
463
408
print ('side flow:' , b )
@@ -469,10 +414,27 @@ def on_sleep():
469
414
yield tasks
470
415
471
416
417
+ def main2 (* args ):
418
+ sock = socket (_socket .AF_INET , _socket .SOCK_STREAM )
419
+ yield sock .connect (('t.co' , 80 ))
420
+
421
+ try :
422
+ yield sock .sendall (b'GET / HTTP/1.1\r \n Host: t.co\r \n \r \n ' )
423
+ val = yield sock .recv (1024 )
424
+ print (val )
425
+ finally :
426
+ sock .close ()
427
+
428
+
472
429
if __name__ == '__main__' :
430
+ print ('Run main1()' )
473
431
event_loop = EventLoop ()
474
432
Context .set_event_loop (event_loop )
475
433
476
434
serv_addr = ('127.0.0.1' , int (sys .argv [1 ]))
477
- event_loop .run (main , serv_addr )
435
+ event_loop .run (main1 , serv_addr )
478
436
437
+ print ('\n Run main2()' )
438
+ event_loop = EventLoop ()
439
+ Context .set_event_loop (event_loop )
440
+ event_loop .run (main2 )
0 commit comments