Skip to content

Commit dffa850

Browse files
authored
Merge pull request #381 from amirhasanpour/sync-package
Update 3.3-sync.md
2 parents 7eeda9b + 48e4ce9 commit dffa850

File tree

1 file changed

+38
-12
lines changed

1 file changed

+38
-12
lines changed

content/chapter 3/3.3-sync.md

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -228,17 +228,18 @@ func main() {
228228
// نویسنده
229229
go func() {
230230
for i := 0; i < 5; i++ {
231-
smap.Write("name", fmt.Sprintf("value-%d", i))
232-
time.Sleep(500 * time.Millisecond)
231+
smap.Write(fmt.Sprintf("book-%d", i), fmt.Sprintf("value-%d", i))
232+
fmt.Printf("Writer wrote %d\n", i)
233+
time.Sleep(200 * time.Millisecond)
233234
}
234235
}()
235236
236237
// چند خواننده همزمان
237238
for i := 0; i < 3; i++ {
238239
go func(id int) {
239240
for j := 0; j < 5; j++ {
240-
fmt.Printf("Reader %d: %s\n", id, smap.Read("name"))
241-
time.Sleep(300 * time.Millisecond)
241+
fmt.Printf("Reader %d read %s\n", id, smap.Read(fmt.Sprintf("book-%d", j)))
242+
time.Sleep(500 * time.Millisecond)
242243
}
243244
}(i)
244245
}
@@ -340,7 +341,15 @@ func worker(name string, wg *sync.WaitGroup) {
340341

341342
فرض کنید می‌خواهیم چند فایل را به صورت موازی دانلود کنیم و منتظر بمانیم تا همه دانلودها کامل شوند:
342343

343-
```go
344+
{{< play >}}
345+
package main
346+
347+
import (
348+
"fmt"
349+
"sync"
350+
"time"
351+
)
352+
344353
func downloadFile(url string, wg *sync.WaitGroup) {
345354
defer wg.Done()
346355
fmt.Println("Downloading:", url)
@@ -360,7 +369,7 @@ func main() {
360369
wg.Wait()
361370
fmt.Println("All downloads complete!")
362371
}
363-
```
372+
{{< /play >}}
364373

365374
### 3.3.3.4 نکات و ترفندهای استفاده از WaitGroup
366375

@@ -412,13 +421,21 @@ for _, task := range tasks {
412421
اگر درخصوص پترن Semaphore بیشتر میخواید بدانید به [اینجا](../../chapter-9/concurrency-patterns/go-concurrency-pattern-semaphore) مراجعه کنید.
413422
{{< /hint >}}
414423

415-
```go
424+
{{< play >}}
425+
package main
426+
427+
import (
428+
"fmt"
429+
"sync"
430+
"time"
431+
)
432+
416433
func process(id int, wg *sync.WaitGroup, sem chan struct{}) {
417434
defer wg.Done()
418-
sem <- struct{}{} // گرفتن اسلات
435+
sem <- struct{}{} // گرفتن اسلات
436+
defer func() { <-sem }() // آزاد کردن اسلات (ایمن‌تر)
419437
fmt.Printf("Processing %d\n", id)
420438
time.Sleep(time.Second)
421-
<-sem // آزاد کردن اسلات
422439
}
423440

424441
func main() {
@@ -433,7 +450,7 @@ func main() {
433450
wg.Wait()
434451
fmt.Println("All processing complete!")
435452
}
436-
```
453+
{{< /play >}}
437454

438455

439456
{{< hint info >}}
@@ -497,7 +514,14 @@ func main() {
497514

498515
`Once` یکی از بهترین راه‌ها برای پیاده‌سازی **الگوی Singleton** در Go هست، چون به صورت ایمن و همزمانی (thread-safe) تضمین می‌کنه که فقط یک instance ساخته می‌شه.
499516

500-
```go
517+
{{< play >}}
518+
package main
519+
520+
import (
521+
"fmt"
522+
"sync"
523+
)
524+
501525
type singleton struct {
502526
data string
503527
}
@@ -519,9 +543,11 @@ func main() {
519543
s2 := GetInstance()
520544
if s1 == s2 {
521545
fmt.Println("Same instance")
546+
} else {
547+
fmt.Println("Not same")
522548
}
523549
}
524-
```
550+
{{< /play >}}
525551

526552
**مزیت:** نیازی به نوشتن قفل‌های اضافه یا متغیر flag نیست، چون `Once` همه چیز رو مدیریت می‌کنه.
527553

0 commit comments

Comments
 (0)