Skip to content

Instantly share code, notes, and snippets.

@PotcFdk
Last active August 29, 2015 14:21
Show Gist options
  • Save PotcFdk/b1e8ea1583728177134a to your computer and use it in GitHub Desktop.
Save PotcFdk/b1e8ea1583728177134a to your computer and use it in GitHub Desktop.
/* pi-goroutines.go
* This spams Goroutines to calculate pi.
* Not a great approach, I just wanted to play around with Goroutines and channels.
*
* PotcFdk, 2015
*/
package main
import (
"fmt"
"math"
"runtime"
"sync"
)
func main() {
fmt.Println(calcpi(1e8))
}
const cap int = 1e6
var free int = cap
var wg sync.WaitGroup
func calcpi(n int) float64 {
ch := make(chan float64)
remaining := n
go collector( ch, n)
wg.Add(1)
for remaining > 0 {
for free > 0 && remaining > 0 {
go term (ch, float64(n - remaining))
free--
remaining--
}
runtime.Gosched()
}
wg.Wait()
return <-ch
}
func collector (ch chan float64, total int) {
sum := float64 (0.0)
fmt.Println ("Started collector, waiting for: ", total)
for k := 0; k < total; k++ {
sum += <-ch
free++
if k % 1e6 == 0 {
fmt.Printf ("progress: %d/%d (%d %%)\n", k, total, int(float64(k)/float64(total) * 100))
}
}
fmt.Println ("Collector finished.")
wg.Done()
ch <- sum
}
func term (ch chan float64, k float64) {
ch <- 4 * math.Pow(-1, k) / (2*k + 1)
}
@PotcFdk
Copy link
Author

PotcFdk commented May 16, 2015

Terminal output:

>go run pi-goroutines.go
Started collector, waiting for:  100000000
progress: 0/100000000 (0 %)
progress: 1000000/100000000 (1 %)
progress: 2000000/100000000 (2 %)
progress: 3000000/100000000 (3 %)
progress: 4000000/100000000 (4 %)
progress: 5000000/100000000 (5 %)
progress: 6000000/100000000 (6 %)
progress: 7000000/100000000 (7 %)
progress: 8000000/100000000 (8 %)
progress: 9000000/100000000 (9 %)
progress: 10000000/100000000 (10 %)
progress: 11000000/100000000 (11 %)
progress: 12000000/100000000 (12 %)
progress: 13000000/100000000 (13 %)
progress: 14000000/100000000 (14 %)
progress: 15000000/100000000 (15 %)
progress: 16000000/100000000 (16 %)
progress: 17000000/100000000 (17 %)
progress: 18000000/100000000 (18 %)
progress: 19000000/100000000 (19 %)
progress: 20000000/100000000 (20 %)
progress: 21000000/100000000 (21 %)
progress: 22000000/100000000 (22 %)
progress: 23000000/100000000 (23 %)
progress: 24000000/100000000 (24 %)
progress: 25000000/100000000 (25 %)
progress: 26000000/100000000 (26 %)
progress: 27000000/100000000 (27 %)
progress: 28000000/100000000 (28 %)
progress: 29000000/100000000 (28 %)
progress: 30000000/100000000 (30 %)
progress: 31000000/100000000 (31 %)
progress: 32000000/100000000 (32 %)
progress: 33000000/100000000 (33 %)
progress: 34000000/100000000 (34 %)
progress: 35000000/100000000 (35 %)
progress: 36000000/100000000 (36 %)
progress: 37000000/100000000 (37 %)
progress: 38000000/100000000 (38 %)
progress: 39000000/100000000 (39 %)
progress: 40000000/100000000 (40 %)
progress: 41000000/100000000 (41 %)
progress: 42000000/100000000 (42 %)
progress: 43000000/100000000 (43 %)
progress: 44000000/100000000 (44 %)
progress: 45000000/100000000 (45 %)
progress: 46000000/100000000 (46 %)
progress: 47000000/100000000 (47 %)
progress: 48000000/100000000 (48 %)
progress: 49000000/100000000 (49 %)
progress: 50000000/100000000 (50 %)
progress: 51000000/100000000 (51 %)
progress: 52000000/100000000 (52 %)
progress: 53000000/100000000 (53 %)
progress: 54000000/100000000 (54 %)
progress: 55000000/100000000 (55 %)
progress: 56000000/100000000 (56 %)
progress: 57000000/100000000 (56 %)
progress: 58000000/100000000 (57 %)
progress: 59000000/100000000 (59 %)
progress: 60000000/100000000 (60 %)
progress: 61000000/100000000 (61 %)
progress: 62000000/100000000 (62 %)
progress: 63000000/100000000 (63 %)
progress: 64000000/100000000 (64 %)
progress: 65000000/100000000 (65 %)
progress: 66000000/100000000 (66 %)
progress: 67000000/100000000 (67 %)
progress: 68000000/100000000 (68 %)
progress: 69000000/100000000 (69 %)
progress: 70000000/100000000 (70 %)
progress: 71000000/100000000 (71 %)
progress: 72000000/100000000 (72 %)
progress: 73000000/100000000 (73 %)
progress: 74000000/100000000 (74 %)
progress: 75000000/100000000 (75 %)
progress: 76000000/100000000 (76 %)
progress: 77000000/100000000 (77 %)
progress: 78000000/100000000 (78 %)
progress: 79000000/100000000 (79 %)
progress: 80000000/100000000 (80 %)
progress: 81000000/100000000 (81 %)
progress: 82000000/100000000 (82 %)
progress: 83000000/100000000 (83 %)
progress: 84000000/100000000 (84 %)
progress: 85000000/100000000 (85 %)
progress: 86000000/100000000 (86 %)
progress: 87000000/100000000 (87 %)
progress: 88000000/100000000 (88 %)
progress: 89000000/100000000 (89 %)
progress: 90000000/100000000 (90 %)
progress: 91000000/100000000 (91 %)
progress: 92000000/100000000 (92 %)
progress: 93000000/100000000 (93 %)
progress: 94000000/100000000 (94 %)
progress: 95000000/100000000 (95 %)
progress: 96000000/100000000 (96 %)
progress: 97000000/100000000 (97 %)
progress: 98000000/100000000 (98 %)
progress: 99000000/100000000 (99 %)
Collector finished.
3.1415926435893473

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment