рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:
- рдкреНрд░рдорд╛рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА C ++ , JS рдФрд░ PHP рдореЗрдВ рд▓рд╛рдЧреВ рд╣реИ , рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред
- рдХреЛрд░рд╛рдЙрдЯрд╛рдЗрди рдФрд░ рдкреНрд░реЛрдорд┐рд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ , рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдПрдБред
- рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕реНрдЯреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
- рд╕рднреА рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдЯреВрд▓ рд╕реЗ рдорд┐рддреНрд░рддрд╛ рдХрд░рддрд╛ рд╣реИред
- рдпрд╣ рдХрд┐рд╕реА рднреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдХрд▓рдХ рдЭрдВрдбреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдкреАрдЫреЗ рджреЗрдЦреЛ
рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рднреЛрд░ рдореЗрдВ, рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдЕрд╡рд░реЛрдз рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдерд╛ред рдлрд┐рд░ рдЗрд╕рдореЗрдВ рд▓реЛрд╣реЗ рдХреА рд░реБрдХрд╛рд╡рдЯ рдбрд╛рд▓реА рдЧрдИред рдЕрдм рдЖрдк рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдзреАрдореА рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЛрд╣реЗ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рд╡реГрджреНрдзрд┐ рдФрд░ рдЗрд╕рдХреА рдХрдо рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рд╕рд╛рде, рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛, рдЬреЛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рдереЗред рдЗрд╕рд▓рд┐рдП рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрд╣реЗ рд╕реЗ рдЕрдореВрд░реНрдд рд╡реНрдпрд╡рдзрд╛рди рдХреЗ рд╕рд╛рде рдкреГрдердХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдереАрдВред
рдЕрдЧрд▓рд╛ рд╡рд┐рдХрд╛рд╕рд╡рд╛рджреА рдЪрд░рдг рдмрд╣реБрдЖрдпрд╛рдореА рдерд╛, рдЬрд┐рд╕реЗ рд╕рдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдиреАрдВрд╡ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕реНрдореГрддрд┐ рдФрд░ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рд╕рд╛рдЭрд╛ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рдеред рд╕реБрд░рдХреНрд╖рд┐рдд рдУрдПрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЕрдкрдиреА рд╕реАрдорд╛рдПрдВ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдУрд╡рд░рд╣реЗрдб рд╣реИрдВред
рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдорд╢реАрдиреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП, рд╡рд╛рджрд╛ / рднрд╡рд┐рд╖реНрдп рдЕрдореВрд░реНрдд 40 + рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж 10K рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдорд╕реНрдпрд╛ рдиреЗ рдЗрд╡реЗрдВрдЯ рд▓реВрдк, рд░рд┐рдПрдХреНрдЯрд░ рдФрд░ рдкреНрд░реЙрдХреНрдЯрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ, рд╕реБрд╕рдВрдЧрдд рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдШрдЯрдирд╛-рдЙрдиреНрдореБрдЦ рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЖрдзреБрдирд┐рдХ рдХреЛрд░рдЯрд╛рдЗрди (рдХреЛрд░рдЯрд╛рдЗрди) рдХреЗ рдкрд╛рд╕ рдЖрдП, рдЬреЛ рдХрд┐ рддрддреНрд╕рдВрдмрдВрдзреА рддрдХрдиреАрдХреА рд╕реАрдорд╛рдУрдВ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдирд┐рдпрддрд╛рддреНрдордХ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рд╛рд░ рдХреЗ рдКрдкрд░ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдПрдХ рдЕрдиреБрдХрд░рдг рд╣реИред
рдШрдЯрдирд╛рдУрдВ, рдкрд░рд┐рдгрд╛рдореЛрдВ рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗ рд╕рднреА рд╡рд╛рджрд╛ / рднрд╡рд┐рд╖реНрдп рдХреА рдПрдХ рд╣реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░ рд▓реМрдЯ рдЖрдПред рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рд▓рдпреЛрдВ рдиреЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдирд╛рдо рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - "рдХрд╛рд░реНрдп"ред
рдЕрдВрдд рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рдм рдХреБрдЫ рдПрдХ рд╕реБрдВрджрд░ async/await
рдкреИрдХреЗрдЬ рдореЗрдВ рдЫрд┐рдкрд╛ рджрд┐рдпрд╛, рдЬрд┐рд╕реЗ рддрдХрдиреАрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдХрд▓рдХ рдпрд╛ рдЕрдиреБрд╡рд╛рджрдХ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд╡рд░реНрддрдорд╛рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ
рдХреЗрд╡рд▓ coroutines рдФрд░ Promise рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, async/await
рд╕рд╛рде рд╕рдЬрд╛рдпрд╛ рдЧрдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдкреБрд░рд╛рдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рд╣реА рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред
рдпреЗ рджреЛрдиреЛрдВ рд╢рдмреНрдж рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреЛрдИ рдХреЛрд░рдЯрд╛рдЗрди рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди Promise
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд░рд╛рд╣рдд рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдХреЙрд▓рдмреИрдХ рдирд░рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, V8 рдЬреИрд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдЗрдВрдЬрди рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рд╢реБрджреНрдз async/await
рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВред
рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ co_async/co_await
рдХрд┐ рдпрд╣ рд╕рдВрд╕рд╛рдзрди рдкрд░ C ++ 17 рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреА рд╡рд┐рд╢рд╛рд▓рдХрд╛рдп рдХреЛрд░рд╛рдЙрдЯреАрди рд╕реЗ рджрдмрд╛рд╡ рдорд╛рдирдХ рд░реВрдк рдореЗрдВ рдЙрдирдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдмреАрдЪ, рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╕рдорд╛рдзрд╛рди Boost.Context , Boost.Fiber рдФрд░ Boost.Coroutine2 рд╣реИ ред
рдЬрд╛рд╡рд╛ рдореЗрдВ, рднрд╛рд╖рд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЕрднреА рднреА рдХреЛрдИ async/await
рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди EA Async рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рдЬреЛ Boost.Context рдХреА рддрд░рд╣, JVM рдФрд░ рдХреЛрдб рдмрд╛рдЗрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЧреЛ рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЙрд░рдЖрдЙрдЯ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЦреБрд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓реЗрдЦ рдФрд░ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рдирд┐рдХрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЦреЛрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред
рд▓реЗрдЦрдХ рдХреА рд░рд╛рдп: рдирдВрдЧреЗ-рдзрд╛рддреБ рдХреЛрд░рдЯрд╛рдЗрди рдЦрддрд░рдирд╛рдХ рд╣реИрдВ
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рд▓реЗрдЦрдХ рдХреЗ рдкрд╛рд╕ рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣реБрдд рдХрдо рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рдорд╢реАрди рдХреЛрдб рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдЫреЗрдбрд╝рдЦрд╛рдиреА рд╕реЗ рдмреЗрд╣рдж рд╕рд╛рд╡рдзрд╛рди рд╣реИред
рдХреБрдЫ рдмрд┐рдВрджреБ:
- рдвреЗрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛:
- рдвреЗрд░ рдкрд░ рдвреЗрд░ рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ: рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рдордп рдкрд░ рдирд┐рд░реНрдзрд╛рд░рдг рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ, рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХреНрд╖рддрд┐ рдФрд░ рдЕрдиреНрдп рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ / рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ,
- рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкреГрд╖реНрда рднреМрддрд┐рдХ рдореЗрдореЛрд░реА, рдПрдХ рд╕рд╢рд░реНрдд рдкреГрд╖реНрда рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рдХреЛ
async
рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: 4 + KB (рдиреНрдпреВрдирддрдо) + рдмрдврд╝реА рд╣реБрдИ рд╕рд┐рд╕реНрдЯрдо рд╕реАрдорд╛рдПрдБ, - рдЕрдВрддрддрдГ, рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдХреЛрд░рдЯрд╛рдЙрди рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдХреЛрд░рдЯрд╛рдЗрдиреНрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ, рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдПрдХ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
- рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореЙрдбрд▓) рдФрд░ рдмрд╛рдЗрдирд░реА рдЗрдВрдЯрд░рдлреЗрд╕ (рдПрдмреАрдЖрдИ) рдХреЗ рд╣рд░ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП : рдЙрджрд╛рд╣рд░рдг ,
- рдирдИ рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╡реНрдпрдХреНрдд рд╕рдорд╕реНрдпрд╛рдУрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯреЗрд▓ TSX, ARM рд╕рд╣-рдкреНрд░реЛрд╕реЗрд╕рд░ рдпрд╛ MIPS) рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреА рд╣реИрдВред
- рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рдмрдВрдж рджрд╕реНрддрд╛рд╡реЗрдЬ (рдмреВрд╕реНрдЯ рдкреНрд░рд▓реЗрдЦрди рдЗрд╕реА рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред
- рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ:
- рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реИрд▓реНрдЧреНрд░рд┐рдВрдб рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдПрдХ рд╣реА рдЬрдореНрдкрд┐рдВрдЧ рд╕реНрдЯреИрдХ,
- рдПрдВрдЯреАрд╡рд╛рдпрд░рд╕ рдХреЗ рд▓рд┐рдП рдмреЛрд▓рдирд╛ рдХрдард┐рди рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╡реЗ рдЕрддреАрдд рдореЗрдВ рдЬреЗрд╡реАрдПрдо рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ,
- рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рдорд▓реЗ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ рдФрд░ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЬреБрдбрд╝реА рдХрдордЬреЛрд░рд┐рдпрд╛рдВ рд╕рд╛рдордиреЗ рдЖрдПрдВрдЧреАред
рд▓реЗрдЦрдХ рдХреА рд░рд╛рдп: рдЬрдирд░реЗрдЯрд░ рдФрд░ yield
рдореМрд▓рд┐рдХ рдмреБрд░рд╛рдИ
рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рддреГрддреАрдп-рдкрдХреНрд╖ рдереАрдо рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдХреЙрд░рдЖрдЙрдЯреНрд╕ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдФрд░ "рдЬрд╛рд░реА" рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХрд┐рд╕реА рднреА рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореМрдЬреВрдж рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдХреНрд░реЙрдкреНрдб рдЗрдЯреЗрд░реЗрдЯрд░-рдЬреЗрдирд░реЗрдЯрд░ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рдмрдирд╛рддреЗ рд╣реИрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди рдореЗрдВ range()
рд╕рд╛рде рдПрдХ рдорд╛рдорд▓рд╛ рддрдХрдиреАрдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣рд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢реЛ рдСрдл рд╣реИред
рдпрджрд┐ рдорд╛рдорд▓рд╛ рдПрдХ рдЕрдирдВрдд рдЬрдирд░реЗрдЯрд░ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рддрд░реНрдХ рдкреНрд░рд╛рдердорд┐рдХ рд╣реИред рдПрдХ рдЕрдВрддрд╣реАрди рдЪрд▓ рд░рд╣реЗ рдЪрдХреНрд░ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рддрдХрдиреАрдХреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреНрдпреЛрдВ рдХрд░реЗрдВред
рдПрдХрдорд╛рддреНрд░ рд╕рдордЭрджрд╛рд░ рдФрдЪрд┐рддреНрдп рдЬреЛ рдмрд╛рдж рдореЗрдВ рдЙрднрд░рд╛ рдХрд┐ рдХреЙрд░рдЖрдЙрдЯ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рдХ рдЙрд▓реНрдЯреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯреНрд░реАрдо рдкрд╛рд░реНрд╕рд░ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрддрд░ рдкрд░ рдПрдХрд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреАрд░реНрдг рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ, рди рдХрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдПред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг, рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╕рдорд╛рдзрд╛рди рд╣реИред рдЗрди рддрдХрдиреАрдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рдЖрдо рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рдПрдХ рдЙрдВрдЧрд▓реА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЧрдВрднреАрд░ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрддрдирд╛ рдХреБрдЫ рд╣реИ рдХрд┐ рдХреБрдЫ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ goto
рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдЙрджрд╛рд╣рд░рдг рдпрд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрджреНрдпреЛрдЧреЛрдВ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рдж рдорд╢реАрди рдХреЛрдб рд╕реНрддрд░ рдХреЗ рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛ рд╕рдХрддреА рд╣реИрдВред
рд▓реЗрдЦрдХреЛрдВ рдХреА рд░рд╛рдп: ECMAScript рдХрд╛ async/await
рд╡рд╛рджрд╛ рдореЙрдбрд▓ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрдХреВрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдХреЙрд░рдЯрд╛рдЗрдиреНрд╕ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕ рдореЙрдбрд▓ рдореЗрдВ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЧреБрдкреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдЧреИрд░-рд░реБрдХрд╛рд╡рдЯ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред C ++ рдореЗрдВ, рдпрд╣ рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдПрдХ рдЙрджрд╛рд╣рд░рдг:
struct SomeObject { using Value = std::vector<int>; Promise funcPromise() { return Promise.resolved(value_); } void funcCallback(std::function<void()> &&cb, const Value& val) { somehow_call_later(cb); } Value value_; }; Promise example() { SomeObject some_obj; return some_obj.funcPromise() .catch([](const std::exception &e){
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, some_obj
рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬрдм example()
рдмрд╛рд╣рд░ some_obj
example()
рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗред
рджреВрд╕рд░реЗ, рд▓реИрдореНрдмреНрдбрд╛ рдЪрд░ рдпрд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ рдХреЙрдкреА / рдореВрд╡ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп std::function
рдореЗрдВ рдЯрд╛рдЗрдк рдЗрд░реЗрдЬ рдХреЗ рджреМрд░рд╛рди рд╣реАрдк рдкрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рддреАрд╕рд░реА рдмрд╛рдд, рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд▓рдЧрд╛рддрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрдЬрд╛рдп, Promise
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдХрд▓реНрдкрдирд╛ "рдкрд░рд┐рдгрд╛рдо" рдХреЗ рд╡рд╛рджреЗ рдкрд░ рдХреА рдЧрдИ рдереАред
рдПрдХ рдпреЛрдЬрдирд╛рдмрджреНрдз рдирд╣реАрдВ рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:
Promise example() { struct LocalContext { SomeObject some_obj; }; auto ctx = std::make_shared<LocalContext>(); return some_obj.funcPromise() .catch([](const std::exception &e){
рдиреЛрдЯ: std::move
рдмрдЬрд╛рдп std::move
std::shared_ptr
рдХрдИ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдФрд░ рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдХрд╛рд░рдг рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред
async/await
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рднрдпрд╛рд╡рд╣рддрд╛ рдПрдХ рд╕реБрдкрд╛рдЪреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрддреА рд╣реИ:
async void example() { SomeObject some_obj; try { SomeObject::Value val = await some_obj.func(); } catch (const std::exception& e) (
рд▓реЗрдЦрдХ рдХреА рд░рд╛рдп: рдХреЛрд░рдЯрд╛рдЗрди рдкреНрд▓рд╛рдирд░ рдПрдХ рд╣рд▓рдЪрд▓ рд╣реИ
рдХреБрдЫ рдЖрд▓реЛрдЪрдХ рдПрдХ рдЕрдиреБрд╕реВрдЪрдХ рдХреА рдХрдореА рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ "рдмреЗрдИрдорд╛рди" рдЙрдкрдпреЛрдЧ рдХреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдиреАрдпрддрд╛ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдХрд╛ рдХреБрд╢рд▓ рдЙрдкрдпреЛрдЧ рд╣реИред
рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдкрд░: рд╡реНрдпрдХреНрддрд┐рдЧрдд coroutines рдХреЗ рд╕реНрддрд░ рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдПрдХ рдмрдбрд╝реЗ рдЙрдкрд░рд┐ рдХреА рддрд░рд╣ рд▓рдЧрддреА рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдХреАрдХреГрдд рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЯреНрд░реИрдлрд┐рдХ рдлреНрд▓реЛ рдпрд╣реА рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ "рд▓реЛрд╣реЗ" рдзрд╛рдЧреЗ рдФрд░ рдУрдПрд╕ рд╕реНрддрд░ рдкрд░ рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╡ рд╣реИред рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдФрд░ / рдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрджрд┐рдо (рдореНрдпреВрдЯреЗрдХреНрд╕, рдереНрд░реЙрдЯрд▓) рдЖрджрд┐рдо рдХреЗ рд╕рд╛рде рдХреЛрд░рдЖрдЙрдЯ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИред
рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд░рдмрд░рдпреБрдХреНрдд рдирд╣реАрдВ рдмрдирд╛рддреА рд╣реИ рдФрд░ рдХреБрд▓ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдкрд░ рдПрдХ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╕реАрдорд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдПрдХ coroutine рдкрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрд╡рд░реБрджреНрдз рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдЙрдкрд╛рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреЙрд▓ рдФрд░ рд▓рдВрдмреА рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЪрдХреНрд░ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред
рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╢реЛрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдХреЛрд░рдЯрд╛рдЗрди рдЦреБрдж рдХреЛ рдвреЗрд░ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдлреНрдпреВрдЪрд░ / рдкреНрд░реЙрдорд┐рд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд┐рд╡рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреЗрдЯрд╛ рдХреА рд╕реНрдерд╛рдиреАрдпрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рднрд╡рд┐рд╖реНрдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рддреЛ рдЙрд╕реА рдХреЙрд░рдЯреАрди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдкреВрд░реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдпрд╛ рдРрд╕реА рдирд┐рд░рдВрддрд░рддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдпрд╛ рддреЛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╣реБрдд рд╣реА рджреБрдЧреБрдирд╛ рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рддреАрд╕рд░рд╛ рдмрд┐рдВрджреБ рднреА рд╣реИ - рдХреЛрд░рдЯрд╛рдЗрди рд╢реЗрдбреНрдпреВрд▓рд░реНрд╕ рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдХрд╛рд░рдг рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдПрдХрд▓ рдИрд╡реЗрдВрдЯ рд▓реВрдк рд╕реНрдЯреНрд░реАрдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рддрд╛рд░реНрдХрд┐рдХ рд╕реНрддрд░ рдкрд░ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓рдмреИрдХ рдмреНрд▓реЙрдХ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рджреМрдбрд╝ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред
рд▓реЗрдЦрдХ рдХреА рд░рд╛рдп: рдореЙрдбрд░реЗрд╢рди рдореЗрдВ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд╣реИ
рдЖрдзреБрдирд┐рдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдирдХрд╛рд░рддреА рдирд╣реАрдВ рд╣реИред рд╕рд╛рде рд╣реА, рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреГрдердХ "рдЖрдпрд░рди" рдереНрд░реЗрдбреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдирдХрд╛рд░рддрд╛ рдирд╣реАрдВ рд╣реИред
рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЛрд░ рд▓реВрдкреНрд╕ рдФрд░ рдЗрд╡реЗрдВрдЯ рд▓реВрдкреНрд╕ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╡реЗрд░рд┐рдПрдВрдЯ рдЯреВрд▓реНрд╕ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреЛрд░рдЖрдЙрдЯ рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдФрд░ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред
FutoIn AsyncSteps - рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк
рд╣рдо ECMAScript (рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рд╡рд╛рджрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдкреИрдЯрд░реНрди рдФрд░ рдХреЙрд▓рдмреИрдХ рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╣рдо рдЗрд╡реЗрдВрдЯ рд▓реВрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
Handle immediate(callack)
рдПрдХ рд╕рд╛рдл рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред- рдЖрд╕реНрдердЧрд┐рдд рдХреЙрд▓рдмреИрдХ
Handle deferred(delay, callback)
ред - рдХреЙрд▓рдмреИрдХ
handle.cancel()
рд░рджреНрдж рдХрд░реЗрдВ handle.cancel()
ред
рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ AsyncTool
рдирд╛рдо рдХрд╛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореМрдЬреВрджрд╛ рд╕рд┐рджреНрдз рдШрдЯрдирд╛рдХреНрд░рдо рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЙрдирдХрд╛ рдХреЛрдИ рд╕реАрдзрд╛ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдПрдВрдЧреЗред
рдЪрд░рдгреЛрдВ рдХрд╛ рдкреЗрдбрд╝:
AsyncSteps рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ, рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЪрд░рдгреЛрдВ рдХреЗ рдПрдХ рд╕рд╛рд░ рдкреЗрдбрд╝ рдХреЛ рдкрдВрдХреНрддрд┐рдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдХрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЧрд╣рд░рд╛ рд╕реНрддрд░ рдХреЗ рдЪрд░рдг рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдорд╛рд░реНрдЧ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред
рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрд╢рди рдПрдХ рдПрдХрд▓ AsyncSteps
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ AsyncSteps
рд╣реИ, рдЬреЛ рдХрд┐ рдХрдиреНрд╡реЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдореНрдореЗрд▓рди рджреНрд╡рд╛рд░рд╛, рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо asi
рдпрд╛ рдкрджрд╛рд╡рдирдд as
ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рд▓реЗрдЦрди рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЛ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╡рд┐рд╣рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдкрдирд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ AsyncSteps
рд▓рд╛рдЧреВ AsyncSteps
, рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдордп рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╕рд╛рд░ рдЙрджрд╛рд╣рд░рдг:
asi.add( // Level 0 step 1 func( asi ){ print( "Level 0 func" ) asi.add( // Level 1 step 1 func( asi ){ print( "Level 1 func" ) asi.error( "MyError" ) }, onerror( asi, error ){ // Level 1 step 1 catch print( "Level 1 onerror: " + error ) asi.error( "NewError" ) } ) }, onerror( asi, error ){ // Level 0 step 1 catch print( "Level 0 onerror: " + error ) if ( error strequal "NewError" ) { asi.success( "Prm", 123, [1, 2, 3], true) } } ) asi.add( // Level 0 step 2 func( asi, str_param, int_param, array_param ){ print( "Level 0 func2: " + param ) } )
рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо:
Level 0 func 1 Level 1 func 1 Level 1 onerror 1: MyError Level 0 onerror 1: NewError Level 0 func 2: Prm
рд╕рд┐рдВрдХ рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
str_res, int_res, array_res, bool_res // undefined try { // Level 0 step 1 print( "Level 0 func 1" ) try { // Level 1 step 1 print( "Level 1 func 1" ) throw "MyError" } catch( error ){ // Level 1 step 1 catch print( "Level 1 onerror 1: " + error ) throw "NewError" } } catch( error ){ // Level 0 step 1 catch print( "Level 0 onerror 1: " + error ) if ( error strequal "NewError" ) { str_res = "Prm" int_res = 123 array_res = [1, 2, 3] bool_res = true } else { re-throw } } { // Level 0 step 2 print( "Level 0 func 2: " + str_res ) }
рдкрд╛рд░рдВрдкрд░рд┐рдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреА рдЕрдзрд┐рдХрддрдо рдирдХрд▓ рддреБрд░рдВрдд рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рдорджрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рдПрдХ рдмрдбрд╝реА рдЧрд╛рдВрда рд╕рдордп рдХреЗ рд╕рд╛рде рдмрдврд╝рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЪрд╛рд░ рд╕рд╛рд▓ рд╕реЗ рдЪрд▓ рд░рд╣реЗ рдЕрднреНрдпрд╛рд╕ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред
рдХреЛрд░ рд░рдирдЯрд╛рдЗрдо рдПрдкреАрдЖрдИ:
add(func[, onerror])
- try-catch
рдирдХрд▓редsuccess([args...])
- рд╕рдлрд▓ рд╕рдорд╛рдкрди рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд:
- рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд╣рд┐рдд
- рдЕрдЧрд▓реЗ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
error(code[, reason)
- рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд░реБрдХрд╛рд╡рдЯ:
code
- рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлрд╝реНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ,reason
- рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдордирдорд╛рдирд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред
state()
- рдереНрд░реЗрдб рд▓реЛрдХрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧред рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рд╛рд╣рдЪрд░реНрдп рдХреБрдВрдЬреА:
error_info
- рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг,last_exception
- рдЕрдВрддрд┐рдо рдЕрдкрд╡рд╛рдж рдХреА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ,async_stack
- рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХрд╛ рдПрдХ рдвреЗрд░ async_stack
рддрдХрдиреАрдХ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ,- рдмрд╛рдХреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкрд┐рдЫрд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ C ++ рдХреЛрдб рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╣реИ:
#include <futoin/iasyncsteps.hpp> using namespace futoin; void some_api(IAsyncSteps& asi) { asi.add( [](IAsyncSteps& asi) { std::cout << "Level 0 func 1" << std::endl; asi.add( [](IAsyncSteps& asi) { std::cout << "Level 1 func 1" << std::endl; asi.error("MyError"); }, [](IAsyncSteps& asi, ErrorCode code) { std::cout << "Level 1 onerror 1: " << code << std::endl; asi.error("NewError", "Human-readable description"); } ); }, [](IAsyncSteps& asi, ErrorCode code) { std::cout << "Level 0 onerror 1: " << code << std::endl; if (code == "NewError") { // Human-readable error info assert(asi.state().error_info == "Human-readable description"); // Last exception thrown is also available in state std::exception_ptr e = asi.state().last_exception; // NOTE: smart conversion of "const char*" asi.success("Prm", 123, std::vector<int>({1, 2, 3}, true)); } } ); asi.add( [](IAsyncSteps& asi, const futoin::string& str_res, int int_res, std::vector<int>&& arr_res) { std::cout << "Level 0 func 2: " << str_res << std::endl; } ); }
рд▓реВрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ:
loop( func, [, label] )
- рдПрдХ рдЕрд╕реАрдо рджреЛрд╣рд░рд╛рд╡ рд╡рд╛рд▓реЗ рд╢рд░реАрд░ рдХреЗ рд╕рд╛рде рдХрджрдоредforEach( map|list, func [, label] )
- рд╕рдВрдЧреНрд░рд╣ рд╡рд╕реНрддреБ рдХрд╛ рдЪрд░рдг-рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐редrepeat( count, func [, label] )
- рдЪрд░рдг-рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рдХреА рд╕рдВрдЦреНрдпрд╛редbreak( [label] )
рдкрд╛рд░рдВрдкрд░рд┐рдХ рд▓реВрдк рд╡реНрдпрд╡рдзрд╛рди рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИредcontinue( [label] )
рдПрдХ рдирдП рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдкрд╛рд░рдВрдкрд░рд┐рдХ рд▓реВрдк рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЖрд░рдХреНрд╖рд┐рдд рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╛рдо breakLoop
, continueLoop
рдФрд░ рдЕрдиреНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
C ++ рдЙрджрд╛рд╣рд░рдг:
asi.loop([](IAsyncSteps& asi) {
рдмрд╛рд╣рд░реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ:
setTimeout( timeout_ms )
- рдПрдХ Timeout
рдмрд╛рдж Timeout
рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ рдпрджрд┐ рдЪрд░рдг рдФрд░ рдЙрд╕рдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИредsetCancel( handler )
- рд░рджреНрдж рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдереНрд░реЗрдб рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░рджреНрдж рдХрд░рдиреЗ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЪрд░рдгреЛрдВ рдХреЗ рдвреЗрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред- рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд╛рд╣реНрдп
waitExternal()
- рдПрдХ рдмрд╛рд╣рд░реА рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдкреНрд░рддреАрдХреНрд╖рд╛ред
- рдиреЛрдЯ: рдпрд╣ рдХреЗрд╡рд▓ рдХрдЪрд░рд╛ рдмреАрдирдиреЗ рд╡рд╛рд▓реА рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред
рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ success()
рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
C ++ рдЙрджрд╛рд╣рд░рдг:
asi.add([](IAsyncSteps& asi) { auto handle = schedule_external_callback([&](bool err) { if (err) { try { asi.error("ExternalError"); } catch (...) {
ECMAScript рдЙрджрд╛рд╣рд░рдг:
asi.add( (asi) => { asi.waitExternal();
рднрд╡рд┐рд╖реНрдп / рд╡рд╛рджрд╛ рдПрдХреАрдХрд░рдг рдПрдкреАрдЖрдИ:
await(promise_future[, on_error])
- рдПрдХ рдХрджрдо рдХреЗ рд░реВрдк рдореЗрдВ рднрд╡рд┐рд╖реНрдп / рд╡рд╛рджрд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИредpromise()
- рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреВрд░реЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдлреНрдпреВрдЪрд░ / рдкреНрд░реЙрдорд┐рд╕ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ execute()
рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
C ++ рдЙрджрд╛рд╣рд░рдг:
[](IAsyncSteps& asi) { // Proper way to create new AsyncSteps instances // without hard dependency on implementation. auto new_steps = asi.newInstance(); new_steps->add([](IAsyncSteps& asi) {}); // Can be called outside of AsyncSteps event loop // new_steps.promise().wait(); // or // new_steps.promise<int>().get(); // Proper way to wait for standard std::future asi.await(new_steps->promise()); // Ensure instance lifetime asi.state()["some_obj"] = std::move(new_steps); };
рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдПрдкреАрдЖрдИ:
AsyncSteps(AsyncTool&)
рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдПрдХ рдзрд╛рдЧрд╛ рдмрд╛рдВрдзрддрд╛ рд╣реИредexecute()
- рдирд┐рд╖реНрдкрд╛рджрди рдереНрд░реЗрдб рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИредcancel()
- рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдзрд╛рдЧреЗ рдХреЛ рд░рджреНрдж рдХрд░рддрд╛ рд╣реИред
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
C ++ рдЙрджрд╛рд╣рд░рдг:
#include <futoin/ri/asyncsteps.hpp> #include <futoin/ri/asynctool.hpp> void example() { futoin::ri::AsyncTool at; futoin::ri::AsyncSteps asi{at}; asi.loop([&](futoin::IAsyncSteps &asi){ // Some infinite loop logic }); asi.execute(); std::this_thread::sleep_for(std::chrono::seconds{10}); asi.cancel(); // called in d-tor by fact }
рдЕрдиреНрдп рдПрдкреАрдЖрдИ:
newInstance()
- рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдкреНрд░рддреНрдпрдХреНрд╖ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИредsync(object, func, onerror)
- рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рдиредparallel([on_error])
- рд╡рд┐рд╢реЗрд╖ add()
, рдЬрд┐рд╕рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЕрд▓рдЧ рд╣реИрдВ AsyncSteps рдзрд╛рд░рд╛рдПрдБ:
- рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп
state()
, - рд╕рднреА рдмрдЪреНрдЪреЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ
- рдХрд┐рд╕реА рднреА рдмрдЪреНрдЪреЗ рдореЗрдВ рдПрдХ рдЕрдирдХрд╣реА рддреНрд░реБрдЯрд┐ рддреБрд░рдВрдд рдЕрдиреНрдп рд╕рднреА рдмрдЪреНрдЪреЗ рдзрд╛рдЧреЗ рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрддреА рд╣реИред
C ++ рдЙрджрд╛рд╣рд░рдг:
#include <futoin/ri/mutex.hpp> using namespace futoin; ri::Mutex mtx_a; void sync_example(IAsyncSteps& asi) { asi.sync(mtx_a, [](IAsyncSteps& asi) { // synchronized section asi.add([](IAsyncSteps& asi) { // inner step in the section // This synchronization is NOOP for already // acquired Mutex. asi.sync(mtx_a, [](IAsyncSteps& asi) { }); }); }); } void parallel_example(IAsyncSteps& asi) { using OrderVector = std::vector<int>; asi.state("order", OrderVector{}); auto& p = asi.parallel([](IAsyncSteps& asi, ErrorCode) { // Overall error handler asi.success(); }); p.add([](IAsyncSteps& asi) { // regular flow asi.state<OrderVector>("order").push_back(1); asi.add([](IAsyncSteps& asi) { asi.state<OrderVector>("order").push_back(4); }); }); p.add([](IAsyncSteps& asi) { asi.state<OrderVector>("order").push_back(2); asi.add([](IAsyncSteps& asi) { asi.state<OrderVector>("order").push_back(5); asi.error("SomeError"); }); }); p.add([](IAsyncSteps& asi) { asi.state<OrderVector>("order").push_back(3); asi.add([](IAsyncSteps& asi) { asi.state<OrderVector>("order").push_back(6); }); }); asi.add([](IAsyncSteps& asi) { asi.state<OrderVector>("order"); // 1, 2, 3, 4, 5 }); };
рддреБрд▓реНрдпрдХрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЖрджрд┐рдо
Mutex
- рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ N=1, Q=unlimited
рджреНрд╡рд╛рд░рд╛ Q
рдореЗрдВ Q
рд╕рд╛рде N
рдереНрд░реЗрдбреНрд╕ рдХреЗ рдПрдХ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИредThrottle
- P
рдореЗрдВ P
Q
рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ N=1, P=1s, Q=0
рджреНрд╡рд╛рд░рд╛ Q
рд╕рд╛рде рдЗрдирдкреБрдЯ N
рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИредLimiter
Mutex
рдФрд░ Throttle
рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдмрд╛рд╣рд░реА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рд▓реЛрдб рдХреЗ рддрд╣рдд рд╕реНрдерд┐рд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдЗрдирдкреБрдЯ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрддрд╛рд░ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ DefenseRejected
рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ DefenseRejected
рддреНрд░реБрдЯрд┐ рдХреЛ DefenseRejected
, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде DefenseRejected
рд╡рд┐рд╡рд░рдг рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдореБрдЦреНрдп рд▓рд╛рдн
AsyncSteps рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЕрдВрдд рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рд╕рдордп-рд╕реАрдорд╛, рд░рджреНрдж рдХрд░рдиреЗ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХреЙрд▓рдмреИрдХ рдХреА рд╕рдордЧреНрд░ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдкреИрджрд╛ рд╣реБрдИ рдереАред рдЙрд╕ рд╕рдордп рдХреЛрдИ рднреА рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдм рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП:
FTN12 тАФ .
setCancel()
тАФ . , . RAII atexit()
.
cancel()
тАФ , . SIGTERM
pthread_cancel()
, .
setTimeout()
тАФ . , "Timeout".
тАФ FutoIn AsyncSteps .
тАФ ABI , . Embedded MMU.
Intel Xeon E3-1245v2/DDR1333 Debian Stretch .
:
- Boost.Fiber
protected_fixedsize_stack
. - Boost.Fiber
pooled_fixedsize_stack
. - FutoIn AsyncSteps .
- FutoIn AsyncSteps (
FUTOIN_USE_MEMPOOL=false
).
- FutoIn NitroSteps<> тАФ .
Boost.Fiber :
- 1 . .
- 30 . 1 . .
- 30 .
mmap()/mprotect()
boost::fiber::protected_fixedsize_stack
. - .
- 30 . 10 . .
"" , .. , . . .
GCC 6.3.0. lang tcmalloc , .
GitHub GitLab .
1.
| | |
---|
Boost.Fiber protected | 4.8s | 208333.333Hz |
Boost.Fiber pooled | 0.23s | 4347826.086Hz |
FutoIn AsyncSteps | 0.21s | 4761904.761Hz |
FutoIn AsyncSteps no mempool | 0.31s | 3225806.451Hz |
FutoIn NitroSteps | 0.255s | 3921568.627Hz |
тАФ .
Boost.Fiber - , pooled_fixedsize_stack
, AsyncSteps.
2.
| | |
---|
Boost.Fiber protected | 6.31s | 158478.605Hz |
Boost.Fiber pooled | 1.558s | 641848.523Hz |
FutoIn AsyncSteps | 1.13s | 884955.752Hz |
FutoIn AsyncSteps no mempool | 1.353s | 739098.300Hz |
FutoIn NitroSteps | 1.43s | 699300.699Hz |
тАФ .
, . , тАФ .
3.
| | |
---|
Boost.Fiber protected | 5.096s | 1962323.390Hz |
Boost.Fiber pooled | 5.077s | 1969667.126Hz |
FutoIn AsyncSteps | 5.361s | 1865323.633Hz |
FutoIn AsyncSteps no mempool | 8.288s | 1206563.706Hz |
FutoIn NitroSteps | 3.68s | 2717391.304Hz |
тАФ .
, Boost.Fiber AsyncSteps, NitroSteps.
| |
---|
Boost.Fiber protected | 124M |
Boost.Fiber pooled | 505M |
FutoIn AsyncSteps | 124M |
FutoIn AsyncSteps no mempool | 84M |
FutoIn NitroSteps | 115M |
тАФ .
, Boost.Fiber .
: Node.js
- Promise
: + 10 . . 10 . JIT NODE_ENV=production
, @futoin/optihelp
.
GitHub GitLab . Node.js v8.12.0 v10.11.0, FutoIn CID .
Tech | Simple | Loop |
---|
Node.js v10 | | |
FutoIn AsyncSteps | 1342899.520Hz | 587.777Hz |
async/await | 524983.234Hz | 630.863Hz |
Node.js v8 | | |
FutoIn AsyncSteps | 682420.735Hz | 588.336Hz |
async/await | 365050.395Hz | 400.575Hz |
тАФ .
async/await
? , V8 Node.js v10 .
, Promise async/await
Node.js Event Loop. ( ), FutoIn AsyncSteps .
AsyncSteps Node.js Event Loop async/await
- Node.js v10.
, ++ тАФ . , Node.js 10 .
рдирд┐рд╖реНрдХрд░реНрд╖
C++, FutoIn AsyncSteps Boost.Fiber , Boost.Fiber mmap()/mprotect
.
, - , . .
FutoIn AsyncSteps JavaScript async/await
Node.js v10.
, -, . .
- "" . тАФ API.
рдирд┐рд╖реНрдХрд░реНрд╖
, FutoIn AsyncSteps , "" async/await
. , . Promise
ECMAScript, AsyncSteps "" .
. AsyncSteps NitroSteps .
, - .
Java/JVM тАФ . .
, GitHub / GitLab .