-
Notifications
You must be signed in to change notification settings - Fork 2
/
semaphore.go
85 lines (74 loc) · 1.63 KB
/
semaphore.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package semaphore
import (
"fmt"
"sync"
"time"
)
var companies []WellKnownCompany
// WellKnownCompany is company's name and country
type WellKnownCompany struct {
Name string
Country string
}
// Display is to display members of WellKnownCompany
func (w WellKnownCompany) Display() {
fmt.Printf("Name: %s, Country: %s\n", w.Name, w.Country)
}
func init() {
companies = []WellKnownCompany{
{Name: "Google", Country: "USA"},
{Name: "Amazon", Country: "USA"},
{Name: "Apple", Country: "USA"},
{Name: "Facebook", Country: "USA"},
{Name: "Netflix", Country: "USA"},
{Name: "Linkedin", Country: "USA"},
{Name: "Instagram", Country: "USA"},
{Name: "IBM", Country: "USA"},
{Name: "Twitter", Country: "USA"},
{Name: "Airbnb", Country: "USA"},
{Name: "Alibaba", Country: "China"},
}
}
// Semaphore is semaphone
func Semaphore(n int) {
wg := &sync.WaitGroup{}
chanSemaphore := make(chan bool, n)
//si.Teachers
for i := 0; i < 100; i++ {
wg.Add(1)
chanSemaphore <- true
//chanSemaphore <- true
go func(idx int) {
defer func() {
<-chanSemaphore
wg.Done()
}()
//concurrent func
fmt.Println(idx)
time.Sleep(1 * time.Second)
}(i)
}
fmt.Println("waiting all go routines ...")
wg.Wait()
}
// Semaphore2 is semaphone
func Semaphore2(n int) {
wg := &sync.WaitGroup{}
chanSemaphore := make(chan bool, n)
//si.Teachers
for _, company := range companies {
wg.Add(1)
chanSemaphore <- true
//chanSemaphore <- true
go func(c WellKnownCompany) {
defer func() {
<-chanSemaphore
wg.Done()
}()
//concurrent func
c.Display()
time.Sleep(1 * time.Second)
}(company)
}
wg.Wait()
}