Skip to content

Commit

Permalink
add: some concurrency pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
Ja7ad committed Jan 12, 2025
1 parent 4d62fc0 commit 6afd9e3
Show file tree
Hide file tree
Showing 7 changed files with 133 additions and 16 deletions.
3 changes: 2 additions & 1 deletion content/chapter 2/2.4-interface.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
---
title: '2.4 اینترفیس (Interface)'
title: 2.4 اینترفیس (Interface)
slug: interface
weight: 3004
mermaid: "true"
---

اینترفیس در زبان گو مجموعه‌ای از متدها است. این مجموعه متدها با توجه به ورودی و خروجی که دارند دارای رفتارهای خاصی هستند. زمانیکه شما یک اینترفیس به همراه یکسری از متدها تعریف می‌کنید باید در جایی این متدها را پیاده سازی کنید.
Expand Down
1 change: 1 addition & 0 deletions content/chapter 3/3.10-concurrency-patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,4 @@ weight: 5010
| [Bridge Channel](../../chapter-9/concurrency-patterns/go-concurrency-pattern-brdige-channel) | با استفاده از الگو Bridge Channel می توانید بین ۲ کانال داده ای را منتقل کنید فرض کنید یک داده را به کانال input میفرستید و از دریافت داده آن را می توانید به کانال دیگری منتقل کنید و عملا شما یک پل برای انتقال داده ایجاد کردید. || |
| [Queuing](../../chapter-9/concurrency-patterns/go-concurrency-pattern-queuing) | الگوی "صف" در زبان گو الگویی است که در آن از یک گوروتین برای بافر کردن و مدیریت ترتیب مقادیر ارسال شده و دریافت شده از یک کانال استفاده می شود. || |
| [Rate limit](../../chapter-9/concurrency-patterns/go-concurrency-pattern-ratelimit) | الگوی **Rate Limiting** برای کنترل تعداد درخواست‌ها یا وظایف همزمان در یک بازه زمانی مشخص استفاده می‌شود. این الگو با استفاده از یک `time.Ticker` یا روش‌های مشابه، اجرای گوروتین‌ها یا پردازش داده‌ها را محدود می‌کند. || |
| [Deadlock Recovery](../../chapter-9/concurrency-patterns/go-concurrency-pattern-deadlock-recovery) | الگوی **بازیابی از بن‌بست** (Deadlock Recovery) برای شناسایی و بازیابی از وضعیت‌های بن‌بست استفاده می‌شود، جایی که چندین گوروتین به طور نامحدود منتظر منابعی هستند که توسط یکدیگر نگه داشته شده‌اند. بن‌بست می‌تواند به دلیل همگام‌سازی نادرست یا رقابت برای منابع در برنامه‌های همزمان رخ دهد. || |
14 changes: 13 additions & 1 deletion content/chapter 9/concurrency patterns/9.4.17-queuing.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
---
title: '9.4.17 الگو Queuing'
title: 9.4.17 الگو Queuing
slug: go-concurrency-pattern-queuing
weight: 177017
mermaid: "true"
---


Expand All @@ -11,6 +12,17 @@ weight: 177017

## 9.4.17.2 دیاگرام


{{< mermaid >}}
flowchart TD
A[شروع] --> B[تولیدکننده‌ها]
B -->|افزودن درخواست‌ها| C[صف درخواست‌ها]
C -->|ارسال به مصرف‌کننده| D[مصرف‌کننده‌ها]
D --> E[پردازش درخواست‌ها]
E --> F[پایان]
{{< /mermaid >}}


## 9.4.17.3 نمونه کد

```go
Expand Down
97 changes: 97 additions & 0 deletions content/chapter 9/concurrency patterns/9.4.19-deadlock-recovery.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
---
title: 9.4.19 الگو Deadlock Recovery
slug: go-concurrency-pattern-deadlock-recovery
weight: 177019
mermaid: "true"
---


## 9.4.19.1 توضیحات

الگوی **بازیابی از بن‌بست** (Deadlock Recovery) برای شناسایی و بازیابی از وضعیت‌های بن‌بست استفاده می‌شود، جایی که چندین گوروتین به طور نامحدود منتظر منابعی هستند که توسط یکدیگر نگه داشته شده‌اند. بن‌بست می‌تواند به دلیل همگام‌سازی نادرست یا رقابت برای منابع در برنامه‌های همزمان رخ دهد. این الگو شامل نظارت بر گوروتین‌ها، شناسایی بن‌بست‌های احتمالی و پیاده‌سازی مکانیزم‌های بازیابی مانند زمان‌بندی، تلاش مجدد یا خاتمه اجباری است.

## 9.4.19.2 دیاگرام


{{< mermaid >}}
flowchart TD
A[شروع] --> B[چندین گوروتین]
B --> C{منتظر منابع}
C -->|بن‌بست شناسایی شد| D[فعال‌سازی مکانیزم بازیابی]
D -->|بازیابی| E[ادامه اجرای برنامه]
C -->|بدون بن‌بست| F[اجرای عادی]
{{< /mermaid >}}




## 9.4.19.3 نمونه کد

```go
package main

import (
"fmt"
"sync"
"time"
)

func deadlockRecoveryExample() {
var mu1, mu2 sync.Mutex
done := make(chan struct{})

go func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("بن‌بست شناسایی و بازیابی شد:", r)
}
}()
mu1.Lock()
defer mu1.Unlock()

time.Sleep(1 * time.Second) // شبیه‌سازی پردازش

mu2.Lock()
defer mu2.Unlock()
done <- struct{}{}
}()

go func() {
mu2.Lock()
defer mu2.Unlock()

time.Sleep(1 * time.Second) // شبیه‌سازی پردازش

mu1.Lock()
defer mu1.Unlock()
done <- struct{}{}
}()

select {
case <-done:
fmt.Println("اجرا با موفقیت به پایان رسید")
case <-time.After(5 * time.Second):
fmt.Println("بن‌بست رخ داد، اجرا متوقف شد")
}
}

func main() {
deadlockRecoveryExample()
}
```

```shell
$ go run main.go
بن‌بست رخ داد، اجرا متوقف شد
```


در کد بالا، دو گوروتین برای دسترسی به منابع `mu1` و `mu2` با یکدیگر رقابت می‌کنند که می‌تواند باعث بن‌بست شود. با استفاده از کانال و تایمر، می‌توان بن‌بست را شناسایی و به طور مناسب مدیریت کرد.

## 9.4.19.4 کاربردها


- **مدیریت منابع در سیستم‌های همزمان:** برای جلوگیری از بن‌بست هنگام استفاده از منابع مشترک.
- **پایگاه داده‌های توزیع‌شده:** شناسایی و بازیابی تراکنش‌هایی که در وضعیت بن‌بست قرار گرفته‌اند.
- **سیستم‌های بلادرنگ:** برای اطمینان از اینکه بن‌بست‌ها باعث تأخیر غیرقابل قبول در اجرا نمی‌شوند.
- **اشکال‌زدایی:** استفاده از این الگو برای یافتن نقاط ضعف در طراحی همزمانی برنامه.
1 change: 1 addition & 0 deletions layouts/partials/docs/inject/body.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<script async="async">
var html = document.documentElement;
var switcher = document.getElementsByClassName('js-toggle')[0];

if(typeof(Storage) !== 'undefined') {
if (localStorage.getItem('themeMode') == 'dark' || document.documentElement.getAttribute('data-theme') == 'dark') {
switcher.classList.add('js-toggle--checked');
Expand Down
16 changes: 16 additions & 0 deletions layouts/partials/docs/inject/head.html
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,19 @@
}
</script>

{{if .Page.Params.mermaid}}
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
<script>
const themeMode = localStorage.getItem('themeMode') || 'light';
mermaid.initialize({startOnLoad:true, theme:themeMode === "dark" ? "dark" : "light"});
const style = document.createElement("style");
style.textContent = `
.mermaid {
display: flex;
justify-content: center;
margin: 1em auto;
}
`;
document.head.appendChild(style);
</script>
{{end}}
17 changes: 3 additions & 14 deletions layouts/shortcodes/mermaid.html
Original file line number Diff line number Diff line change
@@ -1,14 +1,3 @@
<center>
{{ if not (.Page.Scratch.Get "mermaid") }}
<!-- Include mermaid only first time -->
<script src="{{ "mermaid.min.js" | relURL }}"></script>
{{ with resources.Get "mermaid.json" }}
<script>mermaid.initialize({{ .Content | safeJS }})</script>
{{ end }}
{{ .Page.Scratch.Set "mermaid" true }}
{{ end }}

<p class="mermaid{{ with .Get "class" }} {{ . }}{{ end }}">
{{- .Inner -}}
</p>
</center>
<div class="mermaid">
{{.Inner}}
</div>

0 comments on commit 6afd9e3

Please sign in to comment.