рдореИрд╢: рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ, рдХреЛрд░рдЯрд╛рдЗрди, рдПрд╕рд┐рдВрдХреНрд╕ рдФрд░ рд╡реЗрдЯ

рдЫрд╡рд┐

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реМрдХ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЧрдИ рдереАред рдореИрдВ рдЗрд╕реЗ (рдлрд┐рд▓рд╣рд╛рд▓) рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рднрд╛рд╖рд╛ рдирд╣реАрдВ рдорд╛рдирддрд╛, рд▓реЗрдХрд┐рди рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

рдкрд░рд┐рдЪрдп


рд╣рдорд╛рд░реЗ рд╕рдордп рдореЗрдВ рдмрд╣реБ-рдкреНрд░рд╕рд╛рд░ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХрддрд╛ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред

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

рддреЗрдЬ рдмрд╣рд╛рд╡


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

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг:

uses <bf> uses <crt> proc main(): for(i ?= 1; i <= 10; i++): launch: sleep(random() * 100) println(i) end end inputln() end 

рдЖрдЙрдЯрдкреБрдЯ рдЙрджрд╛рд╣рд░рдг:

 9 1 2 7 5 3 10 4 6 8 

рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд▓реЙрдиреНрдЪ рддрдХ рдкрд╣реБрдБрдЪ рдЬрд╛рддрд╛ рд╣реИ..рддреЛ, рдЗрд╕ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд▓реЙрдиреНрдЪ рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдк рдХреЛрдЯрд▓рд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рдЧрднрдЧ рдЙрд╕реА рднрд╛рд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Async рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ


рдЕрдХреЗрд▓реЗ рдХреЛрд░рдЯрд╛рдЗрдиреНрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕реАрд▓рд┐рдП рдореИрд╢ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд╕ рдФрд░ рд╡реЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рднреА рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред

Async рдЖрдкрдХреЛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдФрд░ рдореБрдЦреНрдп рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкреНрд░рддреАрдХреНрд╖рд╛ рдЖрдкрдХреЛ рдЙрд╕ рдХреНрд╖рдг рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдЬрдм рд╕рднреА рдЖрд╡рд╢реНрдпрдХ async рдмреНрд▓реЙрдХ рдкреВрд░реЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг:

 uses <bf> uses <crt> proc main(): println("Hello!") async a: println("Test") sleep(1000) println("Test") sleep(1000) println("Test") sleep(1000) end async b: println("Test 2") sleep(300) println("Test 2") sleep(300) println("Test 2") sleep(300) end wait a, b println("End!") inputln() end 

рдирд┐рд╖реНрдХрд░реНрд╖:

 Hello! Test Test 2 Test 2 Test 2 Test Test End! 

рдХреНрд▓рд╛рд╕рд┐рдХ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ


рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдореБрдЦреНрдп рдХреЛрдб рдЖрдзрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ? <рдереНрд░реЗрдбреНрд╕>ред

рдореБрдЦреНрдп рдШрдЯрдХреЛрдВ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА:

1) TThread рдХреНрд▓рд╛рд╕ (рдХреЗрд╡рд▓ рдПрдХ рдХреНрд▓рд╛рд╕ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреВрд░рд╛ рдХреЛрдб рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЖрдЧреЗ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ):

 class TThread: protected: var ThreadContext public: var Resumed, Terminated, FreeOnTerminate proc Create, Free proc Execute //for overriding proc Suspend, Resume, Terminate, WaitFor, ReJoin //Control proc's end 

2) рдЯреАрд╕реАрдЖрд░ рд░рд╛рдЬрдиреАрддрд┐рдХ рд╡рд░реНрдЧ (рдЗрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг):

 class TCriticalSection: protected: var Critical_Section_Controller public: proc Create, Free //Methods proc Enter, Leave func TryEnter end 


3) рдЬрд▓реНрджреА рд╕реЗ рдзрд╛рдЧреЗ рдмрдирд╛рдиреЗ рдФрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ:
 func Async(method, ...) func Thread(method, ...) func Parallel(method, ...) 


4) рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд░рдорд╛рдгреБ (рдХреНрд░реЙрд╕-рдереНрд░реЗрдб рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЪрд░ рд╡рд░реНрдЧ):
 class TAtomic: private: var Locker, Value public: proc Create, Free proc Set func Get end 


5)
 class TCoroutine(TThread): public: var NextCoroutine proc Create proc Yield, YieldFor end 


рддреЛ, рдЖрдЗрдП рдЗрд╕реЗ рдХреНрд░рдо рдореЗрдВ рд▓реЗрдВред

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

рддреБрд░рдВрдд рдирдореВрдирд╛ рдХреЛрдб:

 uses <bf> uses <crt> uses <threads> class MyThreadClass(TThread): var Param proc Create, Execute end proc MyThreadClass::Create(Param): $Param ?= Param TThread::Create$(true) end proc MyThreadClass::Execute(): for(i ?= 0; i < 10; i++): PrintLn(i, ": ", $Param) end end proc main(): new MyThreadClass("Thread #2!") InputLn() end 

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

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг:

 uses <bf> uses <crt> uses <threads> proc class::MyThreadedProc(): for(i ?= 0; i < 10; i++): PrintLn(i, ": Threaded hello!") end end proc main(): Thr ?= new TThread(false) Thr->Execute ?= class::MyThreadedProc Thr->Resume() InputLn() end 

рдЕрдЧрд░ рд╣рдореЗрдВ рдХрд┐рд╕реА рдирдП рдереНрд░реЗрдб рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдПрд╕рд┐рдВрдХреНрд╕ (), рдереНрд░реЗрдб () рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ () рд╡рд┐рдзрд┐рдпрд╛рдВ рдареАрдХ рд╡рд╣реА рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рдирдП рд╕реВрддреНрд░ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 uses <bf> uses <crt> uses <threads> proc ThreadedProc(Arg): for(i ?= 0; i < 10; i++): PrintLn(i, ": ", Arg) end end proc main(): Async(ThreadedProc, "Thread #1!") InputLn() end 

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

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

рдзрд╛рдЧрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдореИрд╢ рдореЗрдВ TCriticalSection рд╡рд░реНрдЧ рдЬреЛрдбрд╝рд╛ред

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг:

 uses <bf> uses <crt> uses <threads> var CSect = new TCriticalSection() proc ThreadedProc(Arg): while true: CSect -> Enter() PrintLn(Arg) CSect -> Leave() Sleep(10) gc() end end proc CriticalThreadedProc(): while true: Sleep(3000) CSect -> Enter() Sleep(1000) PrintLn("And now...") Sleep(1000) PrintLn("Time to...") Sleep(1000) PrintLn("Critical section!") Sleep(3000) CSect -> Leave() gc() end end proc main(): Async(ThreadedProc, "I'm thread #1!!!") Async(CriticalThreadedProc) InputLn() end 


рдкрд░рдорд╛рдгреБ


рдХрд┐рд╕реА рднреА рдорд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдХрдВрдЯреЗрдирд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг:
 uses <bf> uses <crt> uses <threads> proc main(): MyThreadValue ?= new TAtomic(0) launch: while true: MyThreadValue -> Set(1) Sleep(8) gc() end end launch: while true: MyThreadValue -> Set(2) Sleep(3) gc() end end launch: while true: MyThreadValue -> Set(3) Sleep(11) gc() end end while true: PrintLn(MyThreadValue -> Get()) Sleep(100) gc() end end 


Coroutines


рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЖрдкрдХреЛ рдХреЛрдб рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг:
 uses <bf> uses <crt> uses <threads> proc class::Proc1(): while true: println("Hello world #1") sleep(100) gc() $yield() end end proc class::Proc2(): while true: println("Hello world #2") sleep(100) gc() $yield() end end proc class::Proc3(): while true: println("Hello world #3") sleep(100) gc() $yield() end end proc main(): cor3 ?= new TCoroutine(false, null) cor3 -> Execute ?= class::Proc3 cor2 ?= new TCoroutine(false, cor3) cor2 -> Execute ?= class::Proc2 cor1 ?= new TCoroutine(false, cor2) cor1 -> Execute ?= class::Proc1 cor3 -> NextCoroutine ?= cor1 cor1 -> Resume() InputLn() end 


рдирд┐рд╖реНрдХрд░реНрд╖:
 Hello world #1 Hello world #2 Hello world #3 Hello world #1 Hello world #2 Hello world #3 ... 


рдирд┐рд╖реНрдХрд░реНрд╖


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рд▓реЗрдЦ рд░реЛрдЪрдХ рд▓рдЧрд╛ рд╣реЛрдЧрд╛ред

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ :)

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

 whilst <>: ... end 

рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд▓реВрдк рд╣реИ, рдЗрд╕ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд╛рдж рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИред

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


All Articles