
Go concurrency distilled: უფასო მინი-წიგნი Go-ს კონკურენტულობაზე, ინტერაქტიული მაგალითებით
ანტონ ჟიჟანოვმა უფასო მინი-წიგნი „Go concurrency distilled“ გამოაქვეყნა. ეს Go-ში კონკურენტული პროგრამირების სწრაფი გადამეორებაა, არა დამწყებთათვის განკუთვნილი კურსი: goroutine-ებიდან context-ამდე ყველა თემა ინტერაქტიული მაგალითებითაა ახსნილი.
ანტონ ჟიჟანოვმა, Go-ზე მორგებული ბლოგის antonz.org ავტორმა, 26 სექტემბერს უფასო მინი-წიგნი „Go concurrency distilled“ გამოაქვეყნა. ავტორის აღწერით, ეს Go-ში კონკურენტული პროგრამირების სწრაფი გადამეორებაა და არა დამწყებთათვის განკუთვნილი კურსი: ნულიდან სწავლა და პრაქტიკული სავარჯიშოები მის სხვა წიგნშია „Gist of Go: Concurrency“. თავად ავტორი აღნიშნავს, რომ ახალი წიგნი AI-ის გარეშე დაწერა.
წიგნის სრული ტექსტი ბრაუზერშივე მუშაობს ინტერაქტიული მაგალითებით: ყოველი ნაფრაგმის კოდი შეიძლება შეიცვალო და გვერდზე გაუშვა. PDF ვერსია GitHub-ის nalgeon/go-conc-distilled რეპოზიტორიაშია.
goroutine-ებიდან pipeline-ებამდე
პირველი თავები საფუძვლებს ეხება: go სიტყვით გაშვებულ goroutine-ებს, wait group-ებს და channel-ებს, რომლებითაც goroutine-ები ერთმანეთს მნიშვნელობებს გადასცემენ: ბუფერიანსა და ბუფერის გარეშე, დახურულ და nil channel-ებს. შემდეგ select მოდის: მონაცემთა ნაკადების მართვა, goroutine-ების გაუქმება და არაბლოკირებული ოპერაციები.
ცალკე თავი pipeline-ებს ეთმობა: ყოველი საფეხური ერთი channel-იდან კითხულობს და მეორეში წერს. აქვეა შეცდომების დამუშავების სამი ხერხი: პირველივე შეცდომაზე დაბრუნება, შედეგისა და შეცდომის ერთ ტიპში შეფუთვა და შეცდომების ცალკე channel-ში შეგროვება.
დრო, context და სინქრონიზაცია
დროს ცალკე თავი ეთმობა: time.After დროის შეზღუდვისთვის, timer-ები გადავადებული გაშვებისთვის და ticker-ები პერიოდული ამოცანებისთვის; ციკლში ის ერთი timer-ის განულებას გვირჩევს. context-ის მთავარი დანიშნულება ოპერაციების გაუქმებაა: ხელით, დროის შეზღუდვით ან ვადით. წიგნი context-ის შრეებრივ აგებულებასაც ხსნის: შვილი context მხოლოდ ამცირებს მშობლის ვადას, გაუქმების მრავალი გამოძახება კი უსაფრთხოა. აღწერილია გაუქმების მიზეზის დაყენებაც და context.AfterFunc-ით გამწმენდი ფუნქციის რეგისტრაცია.
სინქრონიზაციის პრიმიტივებიც დეტალურადაა განხილული: wait group-ები (მათ შორის უფრო ახალი Go მეთოდი), mutex-ები TryLock-ითა და RWMutex-ით, სემაფორები, პირობითი ცვლადები signal-ითა და broadcast-ით, sync.Once, sync.Pool ნაგვის შემგროვებელზე დატვირთვის შესამცირებლად და sync/atomic-ის ატომური ოპერაციები. ავტორი ხაზს უსვამს, რომ მონაცემთა რბოლა, რომელსაც race detector -race დროშით იჭერს, და რბოლის პირობა, რომელსაც ვერ იჭერს, სხვადასხვა რამეა.
ტესტირება, დაგეგმვა და დიაგნოსტიკა
ტესტებში ავტორი კოდში უკვე არსებული სინქრონიზაციის წერტილების გამოყენებას გვირჩევს: channel-ები ან Wait მეთოდის მქონე ტიპები. სადაც ასეთი წერტილი არ არის, synctest პაკეტი ეხმარება: ტესტი იზოლირებულ გარსში და ყალბი საათით სრულდება, ამიტომ დროზე დამოკიდებული შემოწმება მყისიერად გადის.
ბოლო თავები scheduler-სა და წარმოების გარემოში დიაგნოსტიკას ეხება. goroutine-ებს runtime ოპერაციული სისტემის ნაკადებზე ანაწილებს, ერთ goroutine-ს კი დაახლოებით 2 კილობაიტი სტეკი სჭირდება. დიაგნოსტიკისთვის წიგნი runtime/metrics პაკეტს, pprof პროფაილერს (CPU, heap, goroutine და mutex პროფილები), go tool trace-ით tracing-ს და flight recording-ს აღწერს, რომელიც ბოლო კვალს მოცურავე ფანჯარაში ინახავს.
SiTech — AI-გაძლიერებული ვებ დეველოპმენტი
ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.