You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -340,7 +341,15 @@ func worker(name string, wg *sync.WaitGroup) {
340
341
341
342
فرض کنید میخواهیم چند فایل را به صورت موازی دانلود کنیم و منتظر بمانیم تا همه دانلودها کامل شوند:
342
343
343
-
```go
344
+
{{< play >}}
345
+
package main
346
+
347
+
import (
348
+
"fmt"
349
+
"sync"
350
+
"time"
351
+
)
352
+
344
353
func downloadFile(url string, wg *sync.WaitGroup) {
345
354
defer wg.Done()
346
355
fmt.Println("Downloading:", url)
@@ -360,7 +369,7 @@ func main() {
360
369
wg.Wait()
361
370
fmt.Println("All downloads complete!")
362
371
}
363
-
```
372
+
{{< /play >}}
364
373
365
374
### 3.3.3.4 نکات و ترفندهای استفاده از WaitGroup
366
375
@@ -412,13 +421,21 @@ for _, task := range tasks {
412
421
اگر درخصوص پترن Semaphore بیشتر میخواید بدانید به [اینجا](../../chapter-9/concurrency-patterns/go-concurrency-pattern-semaphore) مراجعه کنید.
413
422
{{< /hint >}}
414
423
415
-
```go
424
+
{{< play >}}
425
+
package main
426
+
427
+
import (
428
+
"fmt"
429
+
"sync"
430
+
"time"
431
+
)
432
+
416
433
func process(id int, wg *sync.WaitGroup, sem chan struct{}) {
417
434
defer wg.Done()
418
-
sem <-struct{}{} // گرفتن اسلات
435
+
sem <- struct{}{} // گرفتن اسلات
436
+
defer func() { <-sem }() // آزاد کردن اسلات (ایمنتر)
419
437
fmt.Printf("Processing %d\n", id)
420
438
time.Sleep(time.Second)
421
-
<-sem // آزاد کردن اسلات
422
439
}
423
440
424
441
func main() {
@@ -433,7 +450,7 @@ func main() {
433
450
wg.Wait()
434
451
fmt.Println("All processing complete!")
435
452
}
436
-
```
453
+
{{< /play >}}
437
454
438
455
439
456
{{< hint info >}}
@@ -497,7 +514,14 @@ func main() {
497
514
498
515
`Once` یکی از بهترین راهها برای پیادهسازی **الگوی Singleton** در Go هست، چون به صورت ایمن و همزمانی (thread-safe) تضمین میکنه که فقط یک instance ساخته میشه.
499
516
500
-
```go
517
+
{{< play >}}
518
+
package main
519
+
520
+
import (
521
+
"fmt"
522
+
"sync"
523
+
)
524
+
501
525
type singleton struct {
502
526
data string
503
527
}
@@ -519,9 +543,11 @@ func main() {
519
543
s2 := GetInstance()
520
544
if s1 == s2 {
521
545
fmt.Println("Same instance")
546
+
} else {
547
+
fmt.Println("Not same")
522
548
}
523
549
}
524
-
```
550
+
{{< /play >}}
525
551
526
552
**مزیت:** نیازی به نوشتن قفلهای اضافه یا متغیر flag نیست، چون `Once` همه چیز رو مدیریت میکنه.
0 commit comments