рдПрдХ рдкрд╛рдпрдерди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдореЗрдореЛрд░реА рд▓реАрдХ

рдЫрд╡рд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЯреЙрд░рдиреЗрдбреЛ рдврд╛рдВрдЪреЗ рдореЗрдВ рдХрдИ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЛ рд╕реБрд▓рдЭрд╛рдиреЗ рдФрд░ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдкрдиреЗ рдХрднреА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрдгрд┐рдд рдХрд╛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдореИрдВ рдЙрди рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореИрдВрдиреЗ рд▓реАрдХ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред

рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рднрд╛рдЧ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рдЪ рд╣реЛрдВрдЧреЗ - рд╕реАрдкреАрдереЙрдиред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╕реНрдореГрддрд┐ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рджреЛ рддрдВрддреНрд░ рд╣реИрдВред рдкрд╣рд▓реЗ рдПрдХ рд▓рд┐рдВрдХ рдХреА рдЧрд┐рдирддреА рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╛ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рд╕рдВрджрд░реНрдн рд╕рдВрдЦреНрдпрд╛ рдПрдХ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдирдП рдЪрд░ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдЬрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдФрд░ рддрд░реНрдХреЛрдВ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдШрдЯ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рддреБрд░рдВрдд рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдпрд╣ рд╕реНрдХреАрдорд╛ рддрдм рддрдХ рдареАрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдкреЗрдбрд╝ рдХреЗ рдиреЛрдбреНрд╕ рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рдмрдЪреНрдЪреЗ рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдиреЛрдбреНрд╕ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ, рддрдм рднреА рдЬрдм рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдкреНрд░рд┐рдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕реЗ рдиреЛрдбреНрд╕ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореБрдХреНрдд рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рдкрддреНрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди рдореЗрдВ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд╕рд░рд╛ рддрдВрддреНрд░ рд╣реИ - рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ред рдпрд╣ рд╕рдордп-рд╕рдордп рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдмрд╛рдХреА рдХреЛрдб рдХреЛ рд░реЛрдХрдХрд░ рд╕рднреА рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред

рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдкрд░рд┐рдкрддреНрд░ рд▓рд┐рдВрдХ рдХреЛ рд▓реАрдХ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬрд▓реНрдж рдпрд╛ рдмрд╛рдж рдореЗрдВ рдирд╖реНрдЯ рдХрд░ рджреЗрдЧрд╛ред рдПрдХрдорд╛рддреНрд░ рдкрд░реЗрд╢рд╛рдиреА рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдиреЗ рдХреЗрд╡рд▓ рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛, рдЕрдЧрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рд╕рдордп рдкрд░ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖред

рдЬреИрд╕рд╛ рдХрд┐ рдЬреАрд╕реА рдореЙрдбреНрдпреВрд▓ рдкреНрд░рд▓реЗрдЦрди рдХрд╣рддрд╛ рд╣реИ, рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдЖрд╡реГрддреНрддрд┐ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдкрд╛рдпрдерди рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 700 рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ gc.collect() рдордЬрдмреВрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ gc.collect() рджреНрд╡рд╛рд░рд╛ рдПрдХрддреНрд░ рдХреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рдкрд╛рд░ рдХрд░ рд╕рдХрддреА рд╣реИред

 class Node(object): parent = None def __init__(self, *children): self.children = list(children) for node in self.children: node.parent = self @classmethod def tree(cls, depth=1, children=1): if depth == 0: return [] return [cls(*cls.tree(depth-1, children)) for _ in range(children)] import gc from time import time for n in range(1, 21): for _ in range(n): #   . Node.tree(depth=5, children=6) start = time() print('{1} objects collected for n={0} in {2:3.6} msec'.format( n, gc.collect(), (time() - start) * 1000)) 

рдПрди рдХреЗ рдмрд░рд╛рдмрд░ 10 рдФрд░ 20 рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ 107 рд╣рдЬрд╛рд░ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рд╡рд╕реНрддреБрдПрдВ рдорд┐рд▓реАрдВред рддреЛ рдЬреАрд╕реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рдирд░рдо рд╣реИрдВ рдФрд░ рдЙрдирдХреА рдЙрдкрд▓рдмреНрдзрд┐ рддрддреНрдХрд╛рд▓ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреА рд╣реИ (рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдПрдВрдбреНрд░реЗ рд╢реНрд╡реЗрддрд▓реЛрд╡ рдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╣рддреА рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдореМрдЬреВрдж рдореЗрдореЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВред рдирддреАрдЬрддрди, рдпрджрд┐ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЬреЛ рдмрд╣реБрдд рд╕рд╛рд░реА рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрджрд░реНрдн рдЧрд┐рдирддреА рджреНрд╡рд╛рд░рд╛ рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рджреБрдЦрдж рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣реА рд╣реБрдЖ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджреЗрдЦрд╛ рдЧрдпрд╛:

 from tornado import web, ioloop, gen ioloop = ioloop.IOLoop.current() class IndexHandler(web.RequestHandler): megabyte_string = "0123456789abcdef" * 64 * 1024 @web.asynchronous @gen.engine def get(self): self.write("Hello, world<br>") yield gen.Task(self.some_task, self.megabyte_string * 20) self.finish() def some_task(self, bigdata, callback): self.write("some task<br>") callback() application = web.Application([(r'/', IndexHandler)], debug=True) if __name__ == "__main__": print("Start on 8888") application.listen(8888) ioloop.start() 

рдпрд╣ IndexHandler.get() рдкрджреНрдзрддрд┐ рдореЗрдВ url "/" рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рд░реНрд╡рд░ рдмрдирд╛рддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ рдФрд░ рдпрд╣ рдЙрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рдмрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ - 20 рдореЗрдЧрд╛рдмрд╛рдЗрдЯред рдЬреЛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде, рдкрд╛рдпрдерди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдЗрди 20 рдореЗрдЧрд╛рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╕рд╛рде рдШрдЯрддреА рдирд╣реАрдВ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣реИ ab -n 100 -c 4 localhost:8888/ ab -n 100 -c 4 localhost:8888/ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдореЗрдореЛрд░реА рдХреА рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП yield gen.Task() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рд╕реНрдХ рдХреЙрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓реЛрдб рдХреЛ yield gen.Task() рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ ab -n 1000 -c 100 localhost:8888/ ab -n 1000 -c 100 localhost:8888/ , 50 рдПрдордмреА рд╕реЗ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрднреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

  @web.asynchronous @gen.engine def get(self): self.write("Hello, world<br>") self.some_task(self.megabyte_string * 20, self.finish) 

рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХреИрд╕реЗ рдбреАрдмрдЧ рдХрд░реЗрдВ? рдпрд╣ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдпрд╣ рдХреЙрд▓рд┐рдВрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░ рджреЗред рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдпрд╛, рдЬрд┐рд╕реЗ gc.collect() рдХрд╣рд╛ рдЧрдпрд╛ рдФрд░ рдПрдХрддреНрд░рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреАред

 class HealthHandler(web.RequestHandler): def get(self): self.write('{} objects collected'.format(gc.collect())) application = web.Application([(r'/', IndexHandler), (r'/health/', HealthHandler)], debug=True) 

рджреВрд╕рд░рд╛ - рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╕реНрдерд┐рд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред рддреАрд╕рд░рд╛ - рдЖрдкрдХреЛ рдПрдХрддреНрд░рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдПред рдЬреАрд╕реА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рдЙрдкрдХрд░рдг рд╣реИ - рд╕реВрдЪрдирд╛ рдХреЛ рдХреЙрд▓ рдореЗрдВ gc.collect() рджреМрд░рд╛рди рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 import gc gc.disable() gc.set_debug(gc.DEBUG_LEAK) 

рдЕрдм рдЗрд╕ рд░рд┐рд╕рд╛рд╡ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдЖрдкрдХреЛ рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдмрд╣рддреА рд╣реИ рдФрд░ рдкрддреЗ /health/ рдкрд░ рдПрдХрддреНрд░рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдлрд┐рд░ рдПрдХ рд╡рд┐рдзрд┐ рдЪрд▓рд╛рдПрдВ рдЬреЛ рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдкрд╣рд▓реА рд╕реВрдЪреА рд╕реЗ рдРрд╕реА рд╡рд╕реНрддреБрдПрдВ рдЦреЛрдЬреЗрдВ рдЬреЛ рджреВрд╕рд░реА рдореЗрдВ рди рд╣реЛрдВред рдпрд╣рд╛рдБ рд╡реЗ рд╣реИрдВ:

 gc: collectable <cell> ├Ч 4 gc: collectable <dict> ├Ч 3 gc: collectable <function> ├Ч 2 gc: collectable <generator> gc: collectable <instancemethod> gc: collectable <Runner> gc: collectable <set> gc: collectable <Task> gc: collectable <tuple> ├Ч 3 

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЙрдиреНрд╣реАрдВ рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рдореВрд╣ рдмрдирд╛рдпрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЧреИрд░-рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдмреНрдпрд╛рдЬ рдХреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдпрд╣ Task рдФрд░ Runner ред рдпрд╣ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП yield gen.Task() рд▓рд┐рдП, рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣реИред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ Runner рдХреНрдпрд╛ Runner рдФрд░ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ Task рд╕реЗ рдХреНрдпреЛрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдУрдкрди рд╕реЛрд░реНрд╕ рдХреЛрдбред

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдореЗрд░реЗ рд╢реЛрдз рдХреЗ рд╕рдордп рдЯреЙрд░рдиреЗрдбреЛ рд╕рдВрд╕реНрдХрд░рдг 3.1dev2 рдХреЗ рд▓рд┐рдП рд╣реЛрдВрдЧреЗред @gen.engine рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб @gen.engine , рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореВрд▓ рдХрд╛рд░реНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ Runner рд╡рд░реНрдЧ (рдкрдХрдбрд╝рд╛) рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ Task рд╡рд╣ рд╣реИ рдЬреЛ рдЬреЗрдирд░реЗрдЯрд░ рд▓реМрдЯреЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ Runner рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдЬрдЧрд╣ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд▓рд╛рдЗрди yielded = self.gen.send(next) ред рдареАрдХ рд╣реИ, рдлрд┐рд░ рдпрд╣ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ self.yield_point рдореЗрдВ self.yield_point ред рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, self.yield_point .start() рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ Runner рд▓рд┐рдВрдХ рдмрдЪрд╛рддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ Runner.run() рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд▓рд┐рдВрдХ рдХреЛ рдПрдХ рддрд░рдл рдпрд╛ рджреВрд╕рд░реЗ рдкрд░ рддреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ Runner.yield_point рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ, рдФрд░ Task.runner рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИ, рдпрд╣ рд╕реВрдЪрдХ рдХреЛ рддрддреНрд╡ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ Runner.run() рд╡рд┐рдзрд┐ рдЕрдкрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдХрд╣рд╛рдВ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдмрд╡рдВрдбрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рдмрд╣реБрдд рджрд┐рд▓ рдореЗрдВ рд╕реНрд░реЛрдд рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рд╢реАрд░реНрд╖ рдХрд╣рд╛рдВ рд╣реИ рдФрд░ рдиреАрдЪреЗ рдХрд╣рд╛рдВ рд╣реИред .run() рд╡рд┐рдзрд┐ .run() 5 рдирд┐рдХрд╛рд╕ рдмрд┐рдВрджреБ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЙрд▓рдмреИрдХ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдИ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ self.finished рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ self.finished рдлреНрд▓реИрдЧ рдХреЛрдИ self.finished рдирд╣реАрдВ self.finished , рдФрд░ рдЬрд╣рд╛рдВ рдпрд╣ True рдкрд░ рд╕реЗрдЯ рд╣реИ, self.yield_point рдХреЛ self.yield_point рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ ab -n 1000 -c 100 localhost:8888/ ab -n 1000 -c 100 localhost:8888/ ред рд╕рдм рдареАрдХ рд╣реИред

рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдЕрдЬреАрдм рд▓рдЧрд╛ред рдХреЛрдИ рднреА рдЕрдиреБрд░реЛрдз рд╕реНрдореГрддрд┐ рдореЗрдВ рдЕрд╕рдВрдмрджреНрдз рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреНрдпреЛрдВ рдЫреЛрдбрд╝рддрд╛ рд╣реИ? рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдлрд┐рд░ рднреА рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрди рдкрд░ рдЬреЛ @web.asynchronous рдбреЗрдХреЛрд░реЗрдЯрд░ @web.asynchronous ред рдФрд░ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

 gc: collectable <dict> ├Ч 7 gc: collectable <list> ├Ч 16 gc: collectable <tuple> gc: collectable <instancemethod> gc: collectable <ChunkedTransferEncoding> gc: collectable <ExceptionStackContext> gc: collectable <HTTPHeaders> ├Ч 2 gc: collectable <HTTPRequest> gc: collectable <IndexHandler> 

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 5 рдЧреИрд░-рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╣рд╛рдВ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ IndexHandler.finish() рдкрджреНрдзрддрд┐ рдХреЛ IndexHandler.finish() рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдЙрди рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдВрдХ рд╣рдЯрд╛ рджрд┐рдП рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓реАрдВред

 class IndexHandler(web.RequestHandler): @web.asynchronous def get(self): self.write("Hello, world<br>") self.finish() def finish(self, chunk=None): super(IndexHandler, self).finish(chunk) for k, v in self.__dict__.iteritems(): print '"{}":'.format(k), type(v) self.request = None self._headers = None self.application = None self._transforms = None 

рдЗрд╕рдиреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкрд░рд┐рдгрд╛рдо рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ред IndexHandler рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдШрдЯрдХрд░ рджреЛ рд╣реЛ рдЧрдИ: ExceptionStackContext IndexHandler рдФрд░ IndexHandler ред ExceptionStackContext рдХреЛ self._stack_context_handle_exception рддрд░реНрдХ рдХреЗ рд╕рд╛рде @web.asynchronous рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ self рд╕рд┐рд░реНрдл рдПрдХ IndexHandler ред рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдХреЛрдИ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ExceptionStackContext рдЦреБрдж ExceptionStackContext рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, .__enter__() рд╡рд┐рдзрд┐ рд╡рд╣рд╛рдБ рдПрдХ рдкрдВрдХреНрддрд┐ self.new_contexts = (self.old_contexts[0], self) ред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ self.new_contexts рд╕реЗ .__exit__() рддрдХ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдмрд┐рдВрджреБ рдЯреЛрдкреА рдореЗрдВ рд╣реИред

рдирддреАрдЬрддрди, рджреЛрдиреЛрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреБрд▓рдмреНрд░реЗрдХ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЧрдИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдорд╛рд╕реНрдЯрд░ рдореЗрдВ 2.5 рдШрдВрдЯреЗ рдХреЗ рднреАрддрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛, рдЬреЛ рдЙрдкрдпреЛрдЧреА рдкрд░рд┐рд╡рд░реНрддрди рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрди рджреЛ рдкреИрдЪ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╡рдВрдбрд░ рдФрд░ рдПрдХ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж рд╕реНрдореГрддрд┐ рдореЗрдВ рдХрдЪрд░рд╛ рдЫреЛрдбрд╝рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕рдиреЗ рдХрдИ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рджреМрд░рд╛рди рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛, рддреЗрдЬреА рд╕реЗ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рддреЗрдЬ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ред

рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓реАрдХ рдХреЛ рдвреВрдВрдврдирд╛ рдФрд░ рдареАрдХ рдХрд░рдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╡реЗ рд╕реНрд╡рдпрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВред рдлрд┐рд░ рднреА, рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдиреНрд╣реЗрдВ рдЖрд╡реЗрджрди рдореЗрдВ рд╣реИ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЙрдирдХреА рд╡рдЬрд╣ рд╕реЗ рдЖрдкрдХреА рдпрд╛рдж рдореЗрдВ рдХреЛрдИ рднрд╛рд░реА рд╡рд╕реНрддреБ рдирд╣реАрдВ рд▓рдЯрдХ рд░рд╣реА рд╣реИред

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


All Articles