11#!/usr/bin/env python
22# -*- coding: utf-8 -*-
3-
43"""http://www.dabeaz.com/coroutines/"""
54
65import time
76import os
87import sys
98from contextlib import contextmanager
109
10+
1111class Handler :
12+
1213 def __init__ (self , successor = None ):
1314 self ._successor = successor
15+
1416 def handle (self , request ):
1517 res = self ._handle (request )
1618 if not res :
1719 self ._successor .handle (request )
20+
1821 def _handle (self , request ):
1922 raise NotImplementedError ('Must provide implementation in subclass.' )
2023
@@ -25,30 +28,37 @@ def _handle(self, request):
2528 if 0 < request <= 10 :
2629 print ('request {} handled in handler 1' .format (request ))
2730 return True
28-
31+
32+
2933class ConcreteHandler2 (Handler ):
30-
34+
3135 def _handle (self , request ):
3236 if 10 < request <= 20 :
3337 print ('request {} handled in handler 2' .format (request ))
3438 return True
35-
39+
40+
3641class ConcreteHandler3 (Handler ):
37-
42+
3843 def _handle (self , request ):
3944 if 20 < request <= 30 :
4045 print ('request {} handled in handler 3' .format (request ))
4146 return True
47+
48+
4249class DefaultHandler (Handler ):
43-
50+
4451 def _handle (self , request ):
4552 print ('end of chain, no handler for {}' .format (request ))
4653 return True
4754
4855
4956class Client :
57+
5058 def __init__ (self ):
51- self .handler = ConcreteHandler1 (ConcreteHandler3 (ConcreteHandler2 (DefaultHandler ())))
59+ self .handler = ConcreteHandler1 (
60+ ConcreteHandler3 (ConcreteHandler2 (DefaultHandler ())))
61+
5262 def delegate (self , requests ):
5363 for request in requests :
5464 self .handler .handle (request )
@@ -61,6 +71,7 @@ def start(*args, **kwargs):
6171 return cr
6272 return start
6373
74+
6475@coroutine
6576def coroutine1 (target ):
6677 while True :
@@ -70,6 +81,7 @@ def coroutine1(target):
7081 else :
7182 target .send (request )
7283
84+
7385@coroutine
7486def coroutine2 (target ):
7587 while True :
@@ -79,6 +91,7 @@ def coroutine2(target):
7991 else :
8092 target .send (request )
8193
94+
8295@coroutine
8396def coroutine3 (target ):
8497 while True :
@@ -88,20 +101,24 @@ def coroutine3(target):
88101 else :
89102 target .send (request )
90103
104+
91105@coroutine
92106def default_coroutine ():
93- while True :
94- request = yield
95- print ('end of chain, no coroutine for {}' .format (request ))
107+ while True :
108+ request = yield
109+ print ('end of chain, no coroutine for {}' .format (request ))
110+
96111
97112class ClientCoroutine :
113+
98114 def __init__ (self ):
99115 self .target = coroutine1 (coroutine3 (coroutine2 (default_coroutine ())))
100116
101117 def delegate (self , requests ):
102118 for request in requests :
103119 self .target .send (request )
104120
121+
105122def timeit (func ):
106123
107124 def count (* args , ** kwargs ):
@@ -111,6 +128,7 @@ def count(*args, **kwargs):
111128 return res
112129 return count
113130
131+
114132@contextmanager
115133def suppress_stdout ():
116134 try :
@@ -126,7 +144,7 @@ def suppress_stdout():
126144 requests = [2 , 5 , 14 , 22 , 18 , 3 , 35 , 27 , 20 ]
127145
128146 client1 .delegate (requests )
129- print ('-' * 30 )
147+ print ('-' * 30 )
130148 client2 .delegate (requests )
131149
132150 requests *= 10000
0 commit comments