рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдмрд╡рдВрдбрд░ рдпрд╛ рдкреИрдЪ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХрд╛ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд░рд┐рдХреЙрд░реНрдб

рдмрд╡рдВрдбрд░ рдореЗрдВ рдЬрдЯрд┐рд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдХрднреА-рдХрднреА рджрд░реНрдЬрдиреЛрдВ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдлреИрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдЯреЛрд░рдиреЗрдбреЛ.рдЬрди рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдкрдЬ рдХрд╛ рдПрдХ рдмрд╣реБрдд gen.Task (...) рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рд▓рд╛рдк рдХреЗ рдПрдХ рдлрд┐рдЯ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд┐рдЦрд╛ рдЬреЛ рд▓рд┐рдЦрдиреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ:
рдХреЛрдХреЗ рдмрд╛рдж
@asynchronous @gen.engine def get(self): result, status = yield gen.Task( db.users.find_one, { '_id': ObjectId(user_id), }, ) 
 @asynchronous @gen.engine @shortgen def get(self): result, status << db.users.find_one_e({ '_id': ObjectId(user_id), }, ) 


рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛, рд╣рдордиреЗ рдЙрдкрдЬ рдХреЛ << рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдЕрдЬрдЧрд░ рд╣рдореЗрдВ рдорд╛рдирдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдмрд╛рдпреЛрдЯреЗрдХ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╛рдЗрдЯрдкреНрд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рджреЛ рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рдпреЛрдЯреЗрдХ:
 from byteplay import Code from pprint import pprint def gen(): a = yield 1 pprint(Code.from_code(gen.func_code).code) 
 [(SetLineno, 5), #   5  (LOAD_CONST, 1), #   1 (YIELD_VALUE, None), # ""   (STORE_FAST, 'a'), #    a (LOAD_CONST, None), (RETURN_VALUE, None)] 
 def shift(): a << 1 pprint(Code.from_code(shift.func_code).code) 
 [(SetLineno, 10), (LOAD_GLOBAL, 'a'), # a    (LOAD_CONST, 1), #   1 (BINARY_LSHIFT, None), #     a (POP_TOP, None), #     (LOAD_CONST, None), (RETURN_VALUE, None)] 

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреИрдЪ рдмрдирд╛рдПрдВрдЧреЗ:
 from byteplay import YIELD_VALUE, STORE_FAST code = Code.from_code(shift.func_code) code.code[3] = (YIELD_VALUE, None) code.code[4] = (STORE_FAST, 'a') code.code.pop(1) pprint(code.code) 
 [(SetLineno, 10), (LOAD_CONST, 1), (YIELD_VALUE, None), (STORE_FAST, 'a'), (LOAD_CONST, None), (RETURN_VALUE, None)] 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреАрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЗ рд╕рдорд╛рди рдмрд╛рдИрдЯреЗрдХреЛрдб рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╢рд┐рдлреНрдЯ рдХрд░рдиреЗ рдФрд░ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
 shift.func_code = code.to_code() res_gen = gen().send(None) res_shift = shift().send(None) print res_gen print res_shift print res_gen == res_shift 
 1 1 True 

рдкрд░рд┐рдгрд╛рдо рд╡рд╣реА рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЬреАрдердм рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдмреАрдЪ, рд╣рдо рдмрд╡рдВрдбрд░ рдореЗрдВ рд▓реМрдЯ рдЖрдПрдВрдЧреЗред рд▓реАрдЬрд┐рдпреЗ рддреИрдпрд╛рд░ рд╣реЛ рдЧрдпрд╛ рд╢реЙрд░реНрдЯреЗрдЬ рдбреЗрдХреЛрд░реЗрдЯрд░ ред рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦреЗрдВ:

 def fetch(callback): callback(1) class Handler(BaseHandler): @asynchronous @gen.engine @shortgen def get(self): result << gen.Task(fetch) 

рдХреЛрдб рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдХреЙрд▓ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ gen.Task рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рдПрдВрдЧреЗ:

 def fastgen(fnc): return partial(gen.Task, fnc) @fastgen def fetch(callback): callback(1) class Handler(BaseHandler): @asynchronous @gen.engine @shortgen def get(self): result << fetch() 

рдЕрдм рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛? рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкреИрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ! рдирд╣реАрдВ, рд╣рдордиреЗ рдЕрднреА рдмрд╛рдпрдЯреЗрдХрдХреЛрдб рдкреИрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рд┐рд░реНрдл рдмрдВрджрд░ рдкреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдкреБрд░рд╛рдиреЗ рдХреЛрдб рдХреЛ рди рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП __getattribute__ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ:

 def getattribute(self, name): attr = None if name.find('_e') == len(name) - 2: attr = getattr(self, name[:-2]) if hasattr(attr, '__call__'): return fastgen(attr) else: return super(self.__class__, self).__getattribute__(name) 

рдЕрдм рдпрджрд┐ рдкреИрдЪ рдХреА рдЧрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, find_e ( рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ _e рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдкреБрд░рд╛рдиреЗ рдХреЛрдб рдХреЛ рди рддреЛрдбрд╝рд╛ рдЬрд╛рдП), рд╣рдо рдлрд╛рд╕реНрдЯрдЯреИрдЧрди рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рдЦреЛрдЬ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗред
рдФрд░ рдЕрдм рдХреЛрдб, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, asyncmongo рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 from asyncmongo.cursor import Cursor Cursor.__getattribute__ = getattribute class Handler(BaseHandler): @asynchronous @gen.engine @shortgen def get(self): result, status << self.db.posts.find_e({'name': 'post'}) 

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

 pip install -e git+https://github.com/nvbn/evilshortgen.git#egg=evilshortgen 

рдЕрдм рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкреИрдЪ рдХрд░реЗрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 from evilshortgen import shortpatch shortpatch(Cls1, Cls2, Cls3) 

рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯреЗрдВ:

 from evilshortgen import fastgen @fastgen def fetch(id, callback): return callback(id) 

рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 from evilshortgen import shortgen class Handler(BaseHandler): @asynchronous @gen.engine @shortgen def get(self, id): data << fetch(12) num, user << Cls1.fetch() 

рдЬреНрдЮрд╛рдд рдореБрджреНрджреЗ


рдПрдХ рдХреЙрд▓ рдХреЗрд╡рд▓ рдЪрд░ рдХреЗ рд▓рд┐рдП рдорд╛рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреА рд╣реИ:

 a << fetch() #  self.a << fetch() #   

рдЬрдЯрд┐рд▓ decompressions рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ:

 a, b << fetch() #  (a, b), c << fetch() #   

рд╕рдВрджрд░реНрдн


рдЧрд┐рддреВрдм рдкрд░ рдПрд╡рд┐рд▓рд╢реЙрд░реНрдЯрдЬреЗрди
рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ
Byteplay

Source: https://habr.com/ru/post/In153595/


All Articles