рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ

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


рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдпреИрдВрдбреЗрдХреНрд╕ рдбреЗрдЯрд╛ рдПрдирд╛рд▓рд┐рд╕рд┐рд╕ рд╕реНрдХреВрд▓ рдХреЗ рд╢рд┐рдХреНрд╖рдХ рдЗрд╡рд╛рди рдкреБрдЬреЗрд░реЗрд╡рд╕реНрдХреА рдХреА рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред



рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ




1. рд╕рд╛рдордЧреНрд░реА


рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда


2. рдкрд░рд┐рдЪрдп


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


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


 socket s; string x; x = read_from_socket(s, 4); if (x == "ping") { write_to_socket(s, "pong"); } return; 

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



рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднреМрддрд┐рдХ рд╕рдордп рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкрдХреНрд╖рдкрд╛рддреА рд╣реИред



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



I / O рдХреЗ рджреМрд░рд╛рди, рдкреИрдХреЗрдЯ рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рд╕рднреА рдкрд░рд┐рдЪрд░ рднрд╛рд░реА, рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ: рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд▓реЗрдВ, рдЗрд╕реЗ рдПрдХ рднреМрддрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЪрд▓рд╛рдПрдВ рдФрд░ рдмрд╣рд╛рдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдкреНрд░реЛрд╕реЗрд╕рд░ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдкрд╛рд▓рди рдХреЗ рдЙрдкрд╛рдп рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ, рдмрд╕ рд╡реНрдпрд░реНрде рдореЗрдВ рдКрд░реНрдЬрд╛ рдмрд░реНрдмрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реИред



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



3. рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛



3.1ред рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдзрд╛рдЧрд╛


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


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



3.2ред рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдФрд░ рдХрдВрд╕рд░реНрдЯ


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



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


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



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


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



4. рдЕрд╡рд░реБрджреНрдз рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛



рдЖрдЗрдП рдХреБрдЫ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рдкрд╕ рдкрд┐рдВрдЧ-рдкреЛрдВрдЧ:


 socket s; string x; x = read_from_socket(s, 4); if (x == "ping") { write_to_socket(s, "pong"); } return; 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ, рдкрдврд╝рдиреЗ рдФрд░ рд╕рдлреЗрдж рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдзрд╛рдЧрд╛ рд╕реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЕрд╡рд░реБрджреНрдз рд╣реИред рдЖрдорддреМрд░ рдкрд░ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ, "рдкреНрд░рд╡рд╛рд╣ рдЕрд╡рд░реБрджреНрдз рд╣реИред"


 socket s; string x; x = read_from_socket(s, 4); /* thread is blocked here */ if (x == "ping") { write_to_socket(s, "pong"); /* thread is blocked here */ } return; 

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



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


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


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


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




4.1ред рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдкреНрд░рддреАрдХреНрд╖рд╛



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


 int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout); void FD_CLR(int fd, fd_set* set); int  FD_ISSET(int fd, fd_set* set); void FD_SET(int fd, fd_set* set); void FD_ZERO(fd_set* set); int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event); int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout); 

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


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


 int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat); typedef void (*uv_timer_cb)(uv_timer_t* handle); int uv_read_start(uv_stream_t* stream, uv_alloc_cb alloc_cb, uv_read_cb read_cb); int uv_read_stop(uv_stream_t*); typedef void (*uv_read_cb)(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf); int uv_write(uv_write_t* req, uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); typedef void (*uv_write_cb)(uv_write_t* req, int status); 

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



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


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


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


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


 static void ngx_http_request_handler(ngx_event_t *ev) { тАж if (c->close) { ngx_http_terminate_request(r, 0); return; } if (ev->write) { r->write_event_handler(r); } else { r->read_event_handler(r); } ... } /* where the handler... */ typedef void (*ngx_http_event_handler_pt)(ngx_http_request_t *r); struct ngx_http_request_s { /*... */ ngx_http_event_handler_pt read_event_handler; /* ... */ }; /* ...is set when switching to the next processing stage */ r->read_event_handler = ngx_http_request_empty_handler; r->read_event_handler = ngx_http_block_reading; r->read_event_handler = ngx_http_test_reading; r->read_event_handler = ngx_http_discarded_request_body_handler; r->read_event_handler = ngx_http_read_client_request_body_handler; r->read_event_handler = ngx_http_upstream_rd_check_broken_connection; r->read_event_handler = ngx_http_upstream_read_request_handler; 

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


рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рд╣рдо рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВред HTTP рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рдордЧреНрд░ рддрд╕реНрд╡реАрд░ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред


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


 int LibuvStreamWrap::ReadStart() { return uv_read_start(stream(), [](uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { static_cast<LibuvStreamWrap*>(handle->data)->OnUvAlloc(suggested_size, buf); }, [](uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { static_cast<LibuvStreamWrap*>(stream->data)->OnUvRead(nread, buf); }); } /* ...for example, parsing http... */ for (p=data; p != data + len; p++) { ch = *p; reexecute: switch (CURRENT_STATE()) { case s_start_req_or_res: /*... */ case s_res_or_resp_H: /*... */ case s_res_HT: /*... */ case s_res_HTT: /* ... */ case s_res_HTTP: /* ... */ case s_res_http_major: /*... */ case s_res_http_dot: /*... */ /* ... */ 

рдХреЛрдб рдлрд┐рд░ рд╕реЗ рдмрд╣реБрдд рд╣реА рд╡рд┐рдЦрдВрдбрд┐рдд рд╣реИ, рдЕрдиреБрд░реЛрдз рдкрд░ рд╣рдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреА рдХреЛрдИ рд╕рдордЭ рдирд╣реАрдВ рд╣реИред рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдХреНрд▓реЛрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдПрдХрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╕рд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


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



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


  • рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛
  • рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ,
  • рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ,
  • рд╕реЙрдХреЗрдЯ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдирд╛,
  • рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ред

рдЕрдм, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореИрдВ рдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдПрдХ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк:


  • рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛
  • рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛
  • рдлрд╝рд╛рдЗрд▓ рдкрдврд╝реЗрдВ
  • рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкрдврд╝рдирд╛
  • рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкрдврд╝реЗрдВ,
  • рдореИрдВ рдПрдХ рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ
  • рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рд╣реИред

рдпрд╣ рдПрдХ рд░реИрдЦрд┐рдХ рдХреЛрдб рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд╛рдЬреНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИред


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


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



5. рд╡рд╛рдпрджрд╛ / рд╡рд╛рджрд╛



рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ, рдЗрд╕рдореЗрдВ рдХрд╛рд▓реЗ рдФрд░ рд▓рд╛рд▓ рдШреЗрд░реЗ рд╣реИрдВред рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╣рдорд╛рд░рд╛ рдкреНрд░рд╡рд╛рд╣ рдХрд╛рд▓реЗ рдШреЗрд░реЗ рд╣реИрдВ; рдХрднреА-рдХрднреА рд╡реЗ рд▓рд╛рд▓ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдзрд╛рд░рд╛ рдЕрдкрдирд╛ рдХрд╛рдо рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреАред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╣рдорд╛рд░реЗ рдХрд╛рд▓реЗ рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ рдХрд╛рд▓реЗ рдШреЗрд░реЗ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрдм рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред


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



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



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


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


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


рдЗрдиреНрд╣реЗрдВ рдкреНрд░реЙрдорд┐рд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрд╡рдзрд╛рд░рдгрд╛ рд╢рд╛рдВрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмреАрд╕ рд╕рд╛рд▓ рд╕реЗ рдПрдХ рд╢реЗрд▓реНрдл рдкрд░ рдзреВрд▓ рдЗрдХрдЯреНрдард╛ рдХрд░ рд░рд╣рд╛ рд╣реИред тАФ , Twitter, Ruby on Rails Scala, , , , future . Your Server as a Function. , .


Scala, , ++ ?


, Future. T c : , - .


 template <class T> class Future <T> 

, , , . , ┬л┬╗, , . Future ┬л┬╗, Promise тАФ ┬л┬╗. ; , JavaScript, Promise тАФ , Java тАУ Future.


, . , , boost::future ( std::future) тАФ , .



5.1ред Future & Promise


 template <class T> class Future { bool IsSet() const; const T& Get() const; T* TryGet() const; void Subscribe(std::function<void(const T&)> cb); template <class R> Future<R> Then( std::function<R(const T&)> f); template <class R> Future<R> Then( std::function<Future<R>(const T&)> f); }; template <class T> Future<T> MakeFuture(const T& value); 

, , - , . , , , . , , тАФ , , . Then, .


 template <class T> class Promise { bool IsSet() const; void Set(const T& value); bool TrySet(const T& value); Future<T> ToFuture() const; }; template <class T> Promise<T> NewPromise(); 

. , . ┬л, , , ┬╗.



5.2ред



? , . Then тАФ , .


, тАФ future --, - t тАФ . , , , f, - r.


t f. , , r.


: t, , r . :


 template <class T> template <class R> Future<R> Future<T>::Then(std::function<R(const T&)> f) { auto promise = NewPromise<R>(); this->Subscribe([promise] (const T& t) { auto r = f(t); promise.Set(r); }); return promise.ToFuture(); } 

:


  • Promise R ,
  • Future<T> t ,
  • , r = f(t) ,
  • r Promise ,
  • Promise .

f , R , Future<R> , R . :


  • T ,
  • , T , , R ,
  • , R , , .

 template <class T> template <class R> Future<R> Future<T>::Then(std::function<Future<R>(const T&)> f) { auto promise = NewPromise<R>(); this->Subscribe([promise] (const T& t) { auto that = f(t); that.Subscribe([promise] (R r) { promise.Set(r); }); }); return promise.ToFuture(); } 

, - t. f, r, . , , .



, Then :


  • Promise ,
  • Subscribe -,
  • Promise , Future .

, . , , , .


, , , -. , , -, Subscribe. , , , - . , .



5.3ред рдЙрджрд╛рд╣рд░рдг


AsyncComputeValue, GPU, . Then, , (2v+1) 2 .


 Future<int> value = AsyncComputeValue(); //    value.Subscribe([] (int v) { std::cerr << "Value is: " << v << std::endl; }); 

. , : (2v+1) 2 . , .


 //  (2v+1)^2 Future<int> anotherValue = value .Then([] (int v) { return 2 * v; }) .Then([] (int u) { return u + 1; }) .Then([] (int w) { return w * w; }); 

, , . .


. : , ; ; .


 Future<int> GetDbKey(); Future<string> LoadDbValue(int key); Future<void> SendToMars(string message); Future<void> ExploreOuterSpace() { return GetDbKey() // Future<int> .Then(&LoadDbValue) // Future<string> .Then(&SendToMars); // Future<void> } ExploreOuterSpace().Subscribe( [] () { std::cout << "Mission Complete!" << std::endl; }); 

тАФ ExploreOuterSpace. Then; тАФ тАФ , . ( ) . .



5.4ред Any-


: Future , , . , , :


 template <class T> Future<T> Any(Future<T> f1, Future<T> f2) { auto promise = NewPromise<T>(); f1.Subscribe([promise] (const T& t) { promise.TrySet(t); }); f2.Subscribe([promise] (const T& t) { promise.TrySet(t); }); return promise.ToFuture(); } //     

, Any-, Future : , . , , .


, , , , , . ┬л DB1, DB2, тАФ - ┬╗.



5.5ред All-


. , , , ( T1 T2), T1 T2 , , .


 template <class T1, class T2> Future<std::tuple<T1, T2>> All(Future<T1> f1, Future<T2> f2) { auto promise = NewPromise<std::tuple<T1, T2>>(); auto result = std::make_shared< std::tuple<T1, T2> >(); auto counter = std::make_shared< std::atomic<int> >(2); f1.Subscribe([promise, result, counter] (const T1& t1) { std::get<0>(*result) = t1; if (--(*counter) == 0) { promise.Set(*result)); } }); f2.Subscribe([promise, result, counter] (const T2& t2) { /*  */ } return promise.ToFuture(); } //     

nginx. , , . nginx ┬л ┬╗, ┬л ┬╗, ┬л ┬╗ . All- , . .



5.6.


Future Promises тАФ legacy-, . callback- , , : Future, , callback- Future.


 //   cb     void LegacyAsyncComputeStuff(std::function<void(int)> cb); //      Future Future<int> ModernAsyncComputeStuff() { auto promise = NewPromise<int>(); LegacyAsyncComputeStuff( [promise] (int value) { promise.Set(value); }); return promise.ToFuture(); } 

: , Future .



6.



, , . .


 Future<Request> GetRequest(); Future<Payload> QueryBackend(Request req); Future<Response> HandlePayload(Payload pld); Future<void> Reply(Request req, Response rsp); // req  2 :  QueryBackend   Reply GetRequest().Subscribe( [] (Request req) { auto rsp = QueryBackend(req) .Then(&HandlePayload) .Then(Bind(&Reply, req)); }); 

. Request, - . , . , , , . , - .


, , . ? тАФ , request payload, тАФ , .


, Java Netty. , , . , , .


, GetRequest, QueryBackend, HandlePayload Reply , Future.


, , Future T тАФ WaitFor.

 Future<Request> GetRequest(); Future<Payload> QueryBackend(Request req); Future<Response> HandlePayload(Payload pld); Future<void> Reply(Request req, Response rsp); template <class T> T WaitFor(Future<T> future); // req  2 :  QueryBackend   Reply GetRequest().Subscribe( [] (Request req) { auto rsp = QueryBackend(req) .Then(&HandlePayload) .Then(Bind(&Reply, req)); }); 

:


 Future<Request> GetRequest(); Future<Payload> QueryBackend(Request req); Future<Response> HandlePayload(Payload pld); Future<void> Reply(Request req, Response rsp); template <class T> T WaitFor(Future<T> future); auto req = WaitFor(GetRequest()); auto pld = WaitFor(QueryBackend(req)); auto rsp = WaitFor(HandlePayload(pld)); WaitFor(Reply(req, rsp)); 

: Future, . . , . .


. . - 0, , , mutex+cvar future. . , .




6.1ред


, . , , , , - , . , - .


тАФ ┬л┬╗ , , . . . : boost::asio boost::fiber.


, . рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ?



6.2ред WaitFor


, , boost::context, : , ; , . x86/64 , , .


 //      class MachineContext; //     from,    to void SwitchContext(MachineContext* from, MachineContext* to); //      тАУ boost::context //    // * x86_64-ASM (push...-movq(rsp,eip)-pop...-jmpq) // * makecontext/swapcontext // * setjmp/longjmp 

, goto: , , , .


, - . Fiber тАФ . +Future. , , Future, .


 class Fiber { /*    */ MachineContext context_; Future<void> future_; }; 

 class Scheduler { /*    */ void WaitFor(Future<void> future); void Loop(); MachineContext loop_context_; Fiber* current_fiber_; std::deque<Fiber*> run_queue_; }; 

Future , , , . : Loop, , , , , .


WaitFor?


 thread_local Scheduler* ThisScheduler; template <class T> T WaitFor(Future<T> future) { ThisScheduler->WaitFor(future.As<void>()); return future.Get(); } void Scheduler::WaitFor(Future<void> future) { current_fiber_->future_ = future; SwitchContext(┬дt_fiber_->context_, &loop_context_); } 

: , - , , Future void, . .


Future<void> , , - .


WaitFor : : ┬л Fiber Future┬╗, ( ) .


, :
ThisScheduler->WaitFor return future.Get() , .


? , Future, .



6.3ред


- , , , - , . SwitchContext , 2 тАФ .


 void Scheduler::Loop() { while (true) { // (1)     (= !) current_fiber_ = run_queue_.front(); run_queue_.pop_front(); SwitchContext(&loop_context_, ┬дt_fiber_->context_); // (2) ,      //тАж 

? , , , Future, Future, , , .


 void Scheduler::Loop() { while (true) { // (1)     тАж // (2) ,      if (current_fiber_->future_) { current_fiber_->future_.Subscribe( [this, fiber = current_fiber_] { fiber->future_ = nullptr; run_queue_.push_back(fiber); }); } //тАж 

, . :


WaitFor тАФ .



Switch- .



Future ( ), , . - Fiber.



WaitFor Future , - , Future . :


 Future<Request> GetRequest(); Future<Payload> QueryBackend(Request req); Future<Response> HandlePayload(Payload pld); Future<void> Reply(Request req, Response rsp); template <class T> T WaitFor(Future<T> future); auto req = WaitFor( GetRequest()); auto pld = WaitFor( QueryBackend(req)); auto rsp = WaitFor( HandlePayload(pld)); WaitFor( Reply(req, rsp)); 

, , , . , , .



6.4ред Coroutine TS


? тАФ . Coroutine TS, , WaitFor CoroutineWait, CoroutineTS тАФ - . , - . , Waiter Co, , .



7. ?


. , , , . , , , .


тАФ . , . . , . , , , , .


- , , . , . , , .



, ? , .


. , , , , . . , , , , .


nginx, , , , , . , , , future promises.


, , , , , , , .


futures, promises actors. . , .


: , , , . , , , , . ? , .


рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХрд╛ рдорд┐рдирдЯред 19-20 C++ Russia 2019. , , Grimm Rainer ┬лConcurrency and parallelism in C++17 and C++20/23┬╗ , C++ . , . , , - .

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


All Articles