рдпреИрдВрдбреЗрдХреНрд╕ рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо: рдХреЛрдХреАрди рдЗрди рдПрдХреНрд╢рди

рд╣рдо рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдХреАрди рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ "рдШрд░ рдкрд░" рдХреИрд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдП ред рдЖрдЬ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реНрддрд░ рдкрд░ рдЗрд╕рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рд╡реИрд╕реЗ, 26 рдЕрдкреНрд░реИрд▓ рдХреЛ 14:00 рдмрдЬреЗ, рдпреИрдВрдбреЗрдХреНрд╕ рдореЙрд╕реНрдХреЛ рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдПрдХ рдмреИрдардХ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛рдПрдЧреА рдЬрд╣рд╛рдВ рдЖрдк рд╣рдорд╛рд░реЗ рд╕рд╛рде рд▓рд╛рдЗрд╡ рдЪреИрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЬреЛ рдЯреАрдо рдХреЛрдХреЗрди рдмрдирд╛рддреА рд╣реИред рдЖрдУ, рд▓реЗрдХрд┐рди рдкрдВрдЬреАрдХрд░рдг рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред







рддреЛ, рдЖрдЬ рдХреА рдкреЛрд╕реНрдЯ рд╕реЗ рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ:





рдЖрдЗрдП рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ "рдХреЛрдХреАрди" рд░реЛрдЬрд╝рдорд░реНрд░рд╛ рдХреЗ рдЬреАрд╡рди рдореЗрдВ рдЕрдкрдирд╛ рд╡рд┐рд╕рд░реНрдЬрди рд╢реБрд░реВ рдХрд░реЗрдВред



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



рднрд╛рдЧ 1. рдХреЛрдХреАрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛



рд╣рдо рдХреНрд▓рд╛рдЙрдб рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдХреЗ рдЕрдкрдиреА рд╕рдореАрдХреНрд╖рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд░реЗрдбреА-рдореЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬрд┐рд╕рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдХреЛрдИ рд╕реАрдорд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ - рдЧреВрдВрдЬ ред рдЖрд╡реЗрджрди рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдирдП рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рд╣реИред



рдЖрд╡реЗрджрди рдХреИрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ



рд▓рдЧрднрдЧ рдкреВрд░реЗ рд▓реЗрдЦ рдореЗрдВ, рдХреЛрдХреЗрди-рдЯреВрд▓ рдХрдВрд╕реЛрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рд╕реНрд╡рдпрдВ рд╕реНрдерд╛рдкрд┐рдд рдХреЛрдХреАрди-рдлреНрд░реЗрдорд╡рд░реНрдХ-рдкрд╛рдпрдерди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдкрд╛рдпрдерди рдХреА рдЬрд╛рджреБрдИ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:



pip install cocaine-tools
      
      







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



 cocaine-tool app upload
      
      







рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ:



 chmod u+x echo.py
      
      







рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

рдЯреЗрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ



рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдХреАрди рдХреЛ рдПрдХ рдЕрд▓рдЧрд╛рд╡ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдХреАрди рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрдкреЙрди рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдмрд╕ рдЙрд╕ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдореИрдВрдиреЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдерд╛ (рдкреНрд░реЛрдлрд╛рдЗрд▓.рдЬреЙрди):



 { "isolate": { "args": { "spool": "/var/spool/cocaine" }, "type": "process" } }
      
      







рдЖрдк рдЙрд╕реА рдЖрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



 cocaine-tool profile upload --name profile@test --profile ./profile.json
      
      







рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб

рдПрдХ рддреИрдпрд╛рд░ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЗрд╡рд▓ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:



 cocaine-tool app start --name echo --profile profile@test
      
      







рдпрджрд┐ рдХрдВрд╕реЛрд▓ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдЕрдм рд╣реИ

рдмрд╛рджрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ред

рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ

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

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рдеред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд░рддреА рд╣реИ, рд╡рд╣ рдЙрд╕реА рдХреЗ рд╕рд╛рде рдкрд┐рдВрдЧ рдирд╛рдордХ рдПрдХ рдШрдЯрдирд╛ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддреА рд╣реИ

рдмрд╣реБрдд рд╕рдВрджреЗрд╢ рдЬреЛ рдЙрд╕реЗ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред



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



 from cocaine.futures import chain from cocaine.services import Service from tornado.ioloop import IOLoop # Alias for more readability. asynchronous = chain.source if __name__ == '__main__': io_loop = IOLoop.current() service = Service('echo') @asynchronous def invoke(message): result = yield service.enqueue('ping', message) print(result) invoke('Hello World!') invoke('Hello again!') io_loop.start()
      
      







рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЖрдпрд╛рдд рдХреЗ рдмрд╛рдж, рд╣рдо рдмрд╕ рдПрдХ рдХреЛрдХреАрди рд╕реЗрд╡рд╛ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ Service



рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡реЗрджрди рдирд╛рдо (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддрд┐рдзреНрд╡рдирд┐) рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреНрд▓рд╛рд╕ рдореЗрдердбреНрд╕ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЙрдб рд╕рд░реНрд╡рд┐рд╕ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рддрд░реАрдХреЛрдВ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреА рдореИрдкрд┐рдВрдЧ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдХрд╛рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ enqueue



рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕реЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдШрдЯрдирд╛ рдХрд╛ рдирд╛рдо рджреЗрдирд╛, рдФрд░ (рд╢реЗрд╖) (рдЕрдЪрд╛рдирдХ) рд╢реЗрд╖ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡реЗрджрди рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░; рдФрд░ рдлрд┐рд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЙрддреНрддрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЯреЙрд░рдиреЗрдбреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЗрд╡реЗрдВрдЯ рд▓реВрдкрд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВ, рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЬрдм рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ, рддреЛ рд▓реВрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред



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



рдХреЙрд▓ рдХрд╛ рдХреНрд░рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдЪреЗрди



рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрд▓рд╛рдЙрдб рдкрд░ рдЬрд╛рдПрдЧрд╛:

рдореЗрдШ рдореЗрдВ рдбреЗрд░рд╛ рдбрд╛рд▓рдирд╛








рд░рд╣рд╕реНрдпрдордп @asynchronous



рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд░рд┐рдпрд╛рдПрдВ @asynchronous



, рдЕрд░реНрдерд╛рддреН:



рд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:

рдЖрд╡реЗрджрди рдкрд░реАрдХреНрд╖рдг

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдбрд╛рдпрдиреЗрдорд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ, рдЬреЛ рдкрд╛рдпрдерди рд╣реИ, Service



рдХреНрд▓рд╛рд╕ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЛрдХреЗрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп рдЙрдкрд▓рдмреНрдз рддрд░реАрдХреЛрдВ рдХрд╛ рд╕реЗрдЯ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдпрд╛ рдПрдХ рдЕрдиреНрдп рд╕реНрдЯрдм рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ рддреБрд░рдВрдд рд╕рд╡рд╛рд▓ рдереЗ:

рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдиреАрдЪреЗ рдХреБрдЫ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдЙрдирдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдХреЗрди (рдФрд░ рдХреНрд░рдорд╢рдГ, рдХреНрд░рдорд╢рдГ) рдХреИрд╕реЗ рд╣реИрдВ

рдЧрд▓рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо Service



рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рджрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ

рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ , рд▓реЗрдХрд┐рди рдПрдХ рдирд╛рдордорд╛рддреНрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдХреБрдЫ рдирд╛рдоред 42 рдХрд╣реЗрдВ, рд╡рд╣ рд╣реИ:



 echo = Service('42')
      
      







рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореЗрд░реЗ рдкрд╛рд╕ рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдХреАрди рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛, рдФрд░ рд░реВрдкрд░реЗрдЦрд╛ рдлреЗрдВрдХ рджреЗрдЧрд╛

рдПрдХ рдЕрдкрд╡рд╛рджред

рдЖрдЧреЗ рдХреА рд░рдгрдиреАрддрд┐

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



рдЗрд╕реА рддрд░рд╣, рдЖрдк рдПрдХ рдЧреИрд░-рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдШрдЯрдирд╛ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЧрд▓рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред



рдХреЛрдХреАрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓



рдЪрд▓реЛ рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рд░реБрдХреЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдХреИрд╕реЗ рдХреЛрдХреАрди рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ

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



рд╣рд░ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, рдХреЛрдХреЗрди рдПрдХ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реБрдЖ рдЪреИрдирд▓ рдЦреЛрд▓рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рдВрджреЗрд╢ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:



 0, Chunk ::= <Tuple> 1, Error ::= (<Number>, <String>) 2, Choke ::= ()
      
      







рдЪрдВрдХ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рдВрджреЗрд╢ рд╣реИ, рдЬрд╛рдирдХрд╛рд░реА рдЬреЛ рдЧреНрд░рд╛рд╣рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдпрд╛ рдХреЛрдХреЗрди рд╕реНрд╡рдпрдВ, рдЕрдЧрд░ рдпрд╣ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрд╣рдЪрд╛рди рд╕рдХрддрд╛ рд╣реИ) рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ рдХреЛрдб рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдПрдХ рдорд╛рдирд╡-рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╡рд░рдг рдХреЛ рд╡рд╣рди рдХрд░рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЪреИрдирд▓ рдХреЛ рдЪреЛрдХ рдХреЗ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЛрдХреЗрди рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрджреЗрд╢ рдХреЗ рдмрд╛рдж рдХреЛрдИ рдЕрдиреНрдп рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред



рдореИрдВ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ? рд╣реБрдб рдХреЗ рддрд╣рдд, рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдЪреНрдЫрдиреНрди рдХрд░рддрд╛ рд╣реИ

рдпрд╛ рддрд░реАрдХреЗ, рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЧрдарди рдФрд░, рджреВрд╕рд░реА рдУрд░, рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ, рдЕрдирдкреИрдХрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛

рд╕рдВрджреЗрд╢ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВред



рдЪреВрдВрдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХ рдзрд╛рд░рд╛ рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рд╕рдВрджреЗрд╢ рд╣рдореЗрд╢рд╛ Choke



, рд╕рдЦреНрддреА рд╕реЗ рдмреЛрд▓рдирд╛, рдЖрд╡реЗрджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

Chunk



рдХреА рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рдПрдВ, рдЬрд┐рд╕рд╕реЗ рдбреЗрдЯрд╛ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдЯреНрд░реАрдо рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рдЙрдирдХреЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ

рд╡рд╛рдкрд╕реАред



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ



рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдПрдХ рдЪрдВрдХ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрдИ рд╡рд╛рдкрд╕ рдЖрдПред рдХрд╣ рджреЛред рд╣рдорд╛рд░реЗ рд╕реБрдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕рд╕реЗ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдерд╛:



 from cocaine.worker import Worker</python> def echo(request, response): message = yield request.read() response.write(message) response.close() W = Worker() W.run({ 'ping': echo, })
      
      







рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓рдЧрднрдЧ рдЙрд╕реА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХреЛ рд╣рдордиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИред ping



рдирд╛рдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП, echo



рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдЕрдиреБрд░реЛрдз рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред request.read()



рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ, рд╣рдо рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдПрдХ рдЕрдиреБрд░реЛрдз рдкрдврд╝рддреЗ рд╣реИрдВ рдкреНрд░рддреНрдпреЗрдХ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХрдбрд╝рд╛рдИ рд╕реЗ рдПрдХ рд╣реИ), рдФрд░ рд╣рдо response.write(...)



рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВред



рддрджрдиреБрд╕рд╛рд░, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдХрдИ рдЪрдВрдХ рдХреЗ рд╕рд╛рде рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:



 def echo(request, response): message = yield request.read() response.write(message) response.write('Additional message') response.close()
      
      







рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдареАрдХ рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрд╡реЗрджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:



 cocaine-tool app upload && cocaine-tool app restart --name echo --profile profile@test
      
      







рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдпрджрд┐ рд╕рдВрд╢реЛрдзрд┐рдд рдЖрд╡реЗрджрди рд╣рдардкреВрд░реНрд╡рдХ рдЕрджреНрдпрддрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдкреБрдирдГ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ,

рдХреЛрдХреАрди-рд░рдирдЯрд╛рдЗрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рдХреИрд╢ рдЕрдиреБрднрд╛рдЧ) рдореЗрдВ рдХреИрд╢ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред



рдлрд┐рд░ рд╣рдо рдЕрдкрдиреЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╡рд╣ рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ ... рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реАред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ, рдФрд░ рд╣рдо рдЪреИрдирд▓ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЪрдВрдХ рдХреЛ рдШрдЯрд╛рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, invoke



рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓реЗрдВ:



 @asynchronous def invoke(message): result = yield service.enqueue('ping', message) another_result = yield print(result, another_result) io_loop.stop()
      
      







рдЬрдм рдЖрдк рдПрдХ рдЕрдиреНрдп рдЪрдВрдХ рдХреЛ рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪреЛрдХреЗрдВрд╡реЗрдВрдЯ ChokeEvent



рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдлрд┐рд░ рд╕реЗ

рдпрд╣ рдврд╛рдВрдЪрд╛-рдирд┐рд░реНрднрд░ рд╣реИ (рджреВрд╕рд░реЛрдВ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмрдВрдж рдЪреИрдирд▓ рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ)ред



рд╣рд░ рдЬрдЧрд╣ рдЕрд╕рд┐рдВрдЪ



рдЕрдм рдЬрдм рд╣рдордиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдЕрдЬрдЧрд░ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдореВрд▓ рдХрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХреА рд╣реИ, рд╣рдо рдЙрди рдХрд╛рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╣рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореЙрдбрд▓ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред



рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдХреАрди рдФрд░ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдврд╛рдВрдЪреЗ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдХреЗрди рдХрд╛ рдореБрдЦреНрдп рдореЙрдбрд▓ рдЕрднрд┐рдиреЗрддрд╛ рдореЙрдбрд▓ рд╣реИред рдлреНрд░реЗрдорд╡рд░реНрдХ, рдмрджрд▓реЗ рдореЗрдВ, рдХреЛрдХреЗрди рдХреЛ рдЖрд░рдкреАрд╕реА рдХреЙрд▓ рдФрд░ рдЗрд╕рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд░реИрдкрд░ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ Service



рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдХреБрдЫ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ред рдЙрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рд╕рдВрджреЗрд╢ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд╣ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЙрддреНрддрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ, рд╕рдордп рд╕рдорд╛рдкреНрддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВред рдпреЗ рд╕рднреА рдЕрдкреЗрдХреНрд╖рд╛рдПрдБ рд╕рд╛рдорд╛рдиреНрдп IO рдСрдкрд░реЗрд╢рди рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рддреЛ рдЕрдЧрд░ рдЖрдк рдЕрдзрд┐рдХ рдХрд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдардВрдбрд╛ рдХреНрдпреЛрдВ рдХрд░реЗрдВ? рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХреБрдЫ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрджрд┐ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ рджреБрдирд┐рдпрд╛ рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдРрд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рддреНрд╡рд░рд┐рдд рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рд╡рд╛ рдорд┐рд▓реЗрдЧрд╛, рдЬреЛ рдмрд╛рдж рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдмрд░реНрдмрд╛рджреА рд╣реЛрдЧреАред



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



рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рднреА рдХреЛрдХреАрди рдврд╛рдВрдЪреЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд╛ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХрд╛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рдирд╣реАрдВред



рд▓реЗрдХрд┐рди рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?



рд╣рдордиреЗ рдХреЛрдХреЗрди рдХреЛ рдЖрд╡реЗрджрди рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЧрдпрд╛, рдпрд╛ рдПрдХреАрдХреГрдд рд╣реЛ рдЧрдпрд╛ ред рдЕрдм рдЖрдк рдЗрд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рдХрд╛рд╕ рдкреНрд░рддрд┐рдорд╛рдиреЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдореЗрдВ рдЦреБрдж рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ред



рд╣рдо рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрдИ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд┐рдЦрдХрд░ рдЗрд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЗрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗред



рд╕реА ++



C ++ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдЧреНрд░рд╛рд╣рдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:



 #include <cocaine/framework/services/app.hpp> #include <cocaine/framework/services/storage.hpp> #include <iostream> #include <condition_variable> #include <mutex> #include <atomic> namespace cf = cocaine::framework; int main(int argc, char** argv) { auto manager = cf::service_manager_t::create(cf::service_manager_t::endpoint_t("localhost", 10053)); // Get application service object. auto app = manager->get_service<cf::app_service_t>("echo"); std::atomic<int> counter(0); std::condition_variable cv; // Call application. auto g1 = app->enqueue("ping", "Hello from C++"); auto g2 = app->enqueue("ping", "Hello again!"); auto handler = [&counter, &cv](cf::generator<std::string>& g) { counter++; try { // Always packed data. std::cout << "result: " << g.next() << std::endl; } catch (const std::exception& e) { std::cout << "error: " << e.what() << std::endl; } cv.notify_all(); }; g1.then(handler); g2.then(handler); std::mutex m; std::unique_lock<std::mutex> guard(m); while (counter < 2) { cv.wait(guard); } return 0; }
      
      







рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдХреНрд▓реИрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ):



 clang++ -std=c++11 -stdlib=libc++ -lcocaine-core -lcocaine-framework -lmsgpack -lboost_system -lev ../src/clients/echo-client.cpp
      
      







рдпрджрд┐ рдЖрдк GCC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ cl ++ рдХреЛ g ++ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдФрд░ libstdc ++ рдХреЗ рдмрдЬрд╛рдп -stdlib=libc++



рдХреЛ рд╣рдЯрд╛рдХрд░ libc ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред



рдореИрдВрдиреЗ рдХреЛрдб рдкрд░ рдмрд╣реБрдд рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХреА рд╣реИ; рджреЗрд╢реА рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ ред



рдЧрд╣рд░реЗ рд▓рд╛рд▓ рд░рдВрдЧ рдХрд╛



рд░реВрдмреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╣рдо рдЕрджреНрднреБрдд eventmachine



рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ

рд░реВрдмреА рдлрд╛рдЗрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдерд╛ред рдХреЛрдИ рдХреЙрд▓рдмреИрдХ рдпрд╛ рд╡рд╛рдпрджрд╛ рдирд╣реАрдВ!



 require 'cocaine' require 'cocaine/synchrony/service' require 'em-synchrony' class EchoClient EM.synchrony do results = [] service = Cocaine::Synchrony::Service.new 'echo' channel = service.enqueue('ping', 'Hello from Ruby!') channel.each do |result| results.push result end puts results EM.stop end end
      
      







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



рднрд╛рдЧ 2. рд╢реНрд░рдорд┐рдХ



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



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



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



рд╕реЗрд╡рд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдХреИрд╢ рднреА рдХрд░реЗрдЧрд╛ред



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



рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ generate



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



рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп, рд╣рдо qrcode python рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдкреНрд░рд╕рд┐рджреНрдз PIL



рдпрд╛ pillow



рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рдХрдИ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ libpngред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡реЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕реА pip



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ qrcode



:



 >pip install qrcode
      
      







рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдХреЛрдб рджреВрдВрдЧрд╛, рдФрд░ рдлрд┐рд░ рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрдВрдЧрд╛ рдЬреЛ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИ:



 #!/usr/bin/env python import StringIO import msgpack import qrcode from cocaine.exceptions import ServiceError from cocaine.decorators import http from cocaine.logging import Logger from cocaine.services import Service from cocaine.worker import Worker storage = Service('storage') def generate_qr(message, size=10): if size <= 0 or size >= 20: raise ValueError('size argument must fit in [0; 20]') out = StringIO.StringIO() img = qrcode.make(message, box_size=size) img.save(out, 'png') return out.getvalue() def generate(request, response): rq = yield request.read() message, size = msgpack.loads(rq) try: if size < 10: data = generate_qr(message, size) else: key = '{0}size={1}'.format(message, size) try: data = yield storage.read('qr-codes', key) except ServiceError: data = generate_qr(message, size) yield storage.write('qr-codes', key, data) response.write(data) except Exception as err: response.error(1, str(err)) finally: response.close() w = Worker() w.run({ 'generate': generate })
      
      







storage = Service('storage')



рд╣рдо рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП Storage



рд╕реЗрд╡рд╛ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рд╣реИ, рд╣рдо

рджреВрд╕рд░реЗ рд▓реЗрдЦ рдореЗрдВ рдХреЛрдХреАрди-рд░рдирдЯрд╛рдЗрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдЧреНрд░рд╣рдг рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреНрд▓рд╛рдЙрдб рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред



рдЕрдм рдЕрдВрддрд┐рдо рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:



 w = Worker() w.run({ 'generate': generate })
      
      







рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде, рд╣рдо рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдХреЛрдХреЗрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреБрдЫ рдЕрдиреНрдп рдХреНрд░рд┐рдпрд╛рдПрдВ рднреАред рдлрд┐рд░ рд╣рдо рдИрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓реВрдк рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде generate



рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ generate



ред рдЕрдм рд╕рд╣реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА invoke



рд╕рдВрджреЗрд╢ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдЗрдП рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред



рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ:

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓рд╛рдЗрдиреЛрдВ:



 rq = yield request.read() message, size = msgpack.loads(rq)
      
      







рд╣рдо рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдирдкреИрдХ рдХрд░рддреЗ рд╣реИрдВред рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрдХрд┐рдВрдЧ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рддреБрд░рдВрдд рдХреБрдЫ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ: message, size = yield request.read()



ред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╣рдореЗрдВ рдХрдЪреНрдЪреЗ рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдХреБрдЫ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдпрд╣ рдПрдХ рддрд╛рд░ рдерд╛, рдЗрд╕ рдмрд╛рд░ рдПрдХ рдЯрдкрд▓ред рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рдПрдирдХреЛрдбрд░ / рдбрд┐рдХреЛрдбрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо json , рдХрдо рд╕реЗ рдХрдо msgpack , рдХрдо рд╕реЗ рдХрдо protobuf рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рд╣рдордиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ msgpack рдХреЛ рдЪреБрдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ рдФрд░ рдпрд╣ рддреЗрдЬрд╝ рд╣реИред



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



рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдпрджрд┐ рд╣рдо рдЦреБрдж рдЕрдкрд╡рд╛рдж рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЗрд╕реЗ рдХрд░реЗрдЧрд╛ред



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



 key = '{0}size={1}'.format(message, size) try: data = yield storage.read('qr-codes', key) except ServiceError: data = generate_qr(message, size) yield storage.write('qr-codes', key, data)
      
      







рд╣рдо рдПрдХ рдХреБрдВрдЬреА рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рднрдВрдбрд╛рд░ рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИред рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ storage.read('qr-codes', key)



рд╡рд┐рдзрд┐ рдПрдХ рдЕрдкрд╡рд╛рдж storage.read('qr-codes', key)



рдлреЗрдВрдХ storage.read('qr-codes', key)



ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЕрднреА рднреА рдПрдХ рдЪрд┐рддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВред



рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: read



рдФрд░ write



рд╕рдВрдЪрд╛рд▓рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдЕрдкрдиреЗ corutin рдореЗрдВ yield



рдХреАрд╡рд░реНрдб рдкрд░ рдареЛрдХрд░ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдкрд░ рд░рд┐рдЯрд░реНрди рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рддрднреА рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ

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

рд╕рдВрдЧреНрд░рд╣рдг, read



рд╡рд┐рдзрд┐ рдкрд░ рд╣рдЬрд╛рд░реЛрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИредрд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдмрдЪрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред



рдХрд┐рд╕реА рдЪрд┐рддреНрд░ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдмрд╕ рдЗрд╕реЗ рдЪреИрдирд▓ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдпрд╣ finally



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



рдЗрд╕ рдмрд╛рд░ рдХреЙрд▓ рдХрд╛ рдХреНрд░рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЙрд▓ рдЕрдиреБрдХреНрд░рдо




рдпрджрд┐ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд╛ рдкреВрд░рд╛ рд░рд╛рд╕реНрддрд╛ рдорд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ:











рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреА рдЬрд╛рдВрдЪ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЬреИрд╕реЗ echo



рдЖрд╡реЗрджрди рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреЛрдХреАрди рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░реЗрдВ cocaine-tool



:



 cd src/qr && cocaine-tool app upload && cocaine-tool app start --name qr --profile profile@test
      
      







рдлрд┐рд░ рд╣рдо рдПрдХ рдЫреЛрдЯрд╛ рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рдХреНрд▓рд╛рдЗрдВрдЯ echo



рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рд╕реЗ рдЕрдВрддрд░ рдиреНрдпреВрдирддрдо рд╣реИрдВ:

 import StringIO import msgpack from PIL import Image from tornado.ioloop import IOLoop from cocaine.futures import chain from cocaine.services import Service # Alias for more readability. asynchronous = chain.source if __name__ == '__main__': io_loop = IOLoop.current() service = Service('qr') @asynchronous def invoke(message): try: result = yield service.enqueue('generate', msgpack.dumps([message, 10])) print('Result:', result) out = StringIO.StringIO() out.write(result) out.seek(0) img = Image.open(out) img.save('qr.png', 'png') except Exception as err: print('Error: ', err) finally: io_loop.stop() invoke('What is best in life? To crush your enemies, see them driven before you, and to hear the lamentation of ' 'their women.') io_loop.start()
      
      







invoke



, . , , PIL



.



, . - , , HTTP.



: .



: @http



. ( ) request



response



. - read



, , , cocaine.decorators.http._HTTPRequest



, тАФ , , .. ( response



) .



:



 >#!/usr/bin/env python import StringIO import msgpack import qrcode from cocaine.exceptions import ServiceError from cocaine.decorators import http from cocaine.logging import Logger from cocaine.services import Service from cocaine.worker import Worker storage = Service('storage') log = Logger() def generate_qr(message, size=10): if size <= 0 or size >= 20: raise ValueError('size argument must fit in [0; 20]') out = StringIO.StringIO() img = qrcode.make(message, box_size=size) img.save(out, 'png') return out.getvalue() @http def generate(request, response): request = yield request.read() try: message = request.request['message'] size = int(request.request.get('size', 10)) if size < 10: data = generate_qr(message, size) else: key = '{0}size={1}'.format(message, size) try: data = yield storage.read('qr-codes', key) except ServiceError: data = generate_qr(message, size) yield storage.write('qr-codes', key, data) response.write_head(200, [('Content-type', 'image/png')]) response.write(data) except KeyError: response.write_head(400, [('Content-type', 'text/plain')]) response.write('Query field "message" is required') except Exception as err: response.write_head(400, [('Content-type', 'text/plain')]) response.write(str(err)) finally: response.close() w = Worker() w.run({ 'generate-http': generate })
      
      







API , .



: generate-http



тАФ .



? , - , http-, . , , . cocaine-proxy тАФ , HTTP, . cocaine-native-proxy



. , - , cocaine-tool



, , Python, :



 cocaine-tool proxy start --count=32
      
      







count



тАФ , .



: production cocaine-native-proxy



. , .



, , . ? .



URI . : <APP>/<METHOD>[?<Args>]



.



X-Cocaine-Service



X-Cocaine-Event



.



. URI : /qr/generate-http?message=Hello%20World!&size=10



.



. , - :







: cocaine-proxy



(, Storage



) тАФ .





, , , . , .



, Cocaine .



ab . : , , 100000 32 ( , ) , Cocaine .



, ,

. cocaine-runtime



,

:



 cocaine-tool info
      
      







Cocaine , - :







, . . ┬лstate┬╗ . . ┬лslaves┬╗ , , Cocaine ( ). ┬лqueue┬╗ ( , ) . , . , ┬лsessions┬╗ , , . , , . тАФ .



! , cocaine-runtime



cocaine-tool info



:



 ab -n 100000 -c 32 'localhost:8080/qr/generate-http?message=Hello%20World!&size=10'
      
      







, , . 100000 32 . cocaine-runtime



, 6 QR-, cocaine-runtime



:



 [Tue Apr 8 15:36:18 2014] [INFO] app/qr: enlarging the pool from 5 to 6 slaves
      
      







cocaine-tool info



- :



, 6, 10. , 7 . , Cocaine , .



, , . - тАФ SIGTERM



, .



Cocaine.



Python!



! , тАФ ( ) , .



Go, , . , , . , , .



Go тАФ . рдордЬрд╛ рдЖ рдЧрдпрд╛!



 >package main import ( "net/http" "code.google.com/p/rsc/qr" "github.com/ugorji/go/codec" "github.com/cocaine/cocaine-framework-go/cocaine" ) //msgpack specific var ( mh codec.MsgpackHandle h = &mh ) var ( OkHeaders cocaine.Headers = cocaine.Headers{[2]string{"Content-type", "image/png"}} ErrorHeaders cocaine.Headers = cocaine.Headers{[2]string{"Content-type", "text/plain"}} storage *cocaine.Service ) const ( cacheNamepspace = "qr-code" cacheTag = "qr-tag" ) func qenerate(text string) (png []byte, err error) { res := <-storage.Call("read", cacheNamepspace, text) if res.Err() == nil { err = res.Extract(&png) return } c, err := qr.Encode(text, qr.L) if err != nil { return } png = c.PNG() <-storage.Call("write", cacheNamepspace, text, string(png), []string{cacheTag}) return } func on_generate(request *cocaine.Request, response *cocaine.Response) { defer response.Close() inc := <-request.Read() var task struct { Text string Size int } err := codec.NewDecoderBytes(inc, h).Decode(&task) if err != nil { response.ErrorMsg(-100, err.Error()) return } png, err := qenerate(task.Text) if err != nil { response.ErrorMsg(-200, err.Error()) return } response.Write(png) } func on_http_generate(request *cocaine.Request, response *cocaine.Response) { defer response.Close() r, err := cocaine.UnpackProxyRequest(<-request.Read()) if err != nil { response.ErrorMsg(-200, err.Error()) return } message := r.FormValue("message") if len(message) == 0 { response.Write(cocaine.WriteHead(http.StatusBadRequest, ErrorHeaders)) response.Write("Missing argument `message`") return } png, err := qenerate(message) if err != nil { response.Write(cocaine.WriteHead(http.StatusInternalServerError, ErrorHeaders)) response.Write("Unable to generate QR") return } response.Write(cocaine.WriteHead(http.StatusOK, OkHeaders)) response.Write(png) } func main() { binds := map[string]cocaine.EventHandler{ "generate": on_generate, "generate-http": on_http_generate, } Worker, err := cocaine.NewWorker() if err != nil { panic(err) } storage, err = cocaine.NewService("storage") if err != nil { panic(err) } Worker.Loop(binds) }
      
      







, ! Cocaine .



рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп





Cocaine , . , . , , Cocaine Runtime, . , , , . Cocaine.



, . Cocaine, , . , , , , .



All Articles