Guest User

Untitled

a guest
Jun 20th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.98 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "log"
  6. "math/rand"
  7. "time"
  8. )
  9.  
  10. type Threader struct {
  11. TIME_LIMIT time.Time
  12. numWorkers int
  13. jobs int
  14. jobsProduced int
  15. jobsWorking int
  16. doneProducing chan bool
  17. doneReceiving chan bool
  18. pwCounterChan chan int
  19. pwChan chan int
  20. wrChan chan int
  21. errChan chan error
  22. initTime time.Time
  23. }
  24.  
  25. const TIME_LIMIT = time.Second
  26.  
  27. func main() {
  28. mimt := Threader{}
  29. mimt.Init(4, 27)
  30. }
  31.  
  32. func (tr *Threader) Init(numWorkers int, jobs int) {
  33.  
  34. tr.pwCounterChan = make(chan int)
  35.  
  36. tr.doneProducing = make(chan bool)
  37. tr.doneReceiving = make(chan bool)
  38.  
  39. tr.pwChan = make(chan int)
  40. tr.wrChan = make(chan int)
  41.  
  42. tr.errChan = make(chan error)
  43.  
  44. tr.initTime = time.Now()
  45.  
  46. tr.numWorkers = numWorkers
  47. tr.jobsWorking = 0
  48. log.Printf("Init %p", &tr.jobsWorking)
  49. tr.jobs = jobs
  50. // start producing jobs
  51. go tr.produce()
  52. // start waiting for jobs done
  53. go tr.receiver()
  54. // start workers for jobs
  55. for i := 0; i < tr.numWorkers; i++ {
  56. go tr.work()
  57. }
  58. // wait for done producing
  59. <-tr.doneProducing
  60. }
  61.  
  62. func (tr *Threader) produce() {
  63. // current job
  64. i := 0
  65. // marker for timing
  66. tr.jobsProduced = 0
  67. // start tracking time passed producing
  68. t := time.Now()
  69. log.Printf("Jobs Working %p", &tr.jobsWorking)
  70. javi := 0
  71. exit := 0
  72. for {
  73.  
  74. for {
  75. select {
  76. case n := <-tr.pwCounterChan:
  77. javi += n
  78. fmt.Println("received javi", n, "jval", javi)
  79. default:
  80. exit = 1
  81. }
  82. if exit == 1 {
  83. exit = 0
  84. break
  85. }
  86. }
  87.  
  88. if tr.jobsProduced == tr.numWorkers {
  89. // if moreThanTimeLimit has passed
  90. if moreThanTL(t) {
  91. // reset
  92. tr.jobsProduced = javi
  93. t = time.Now()
  94. }
  95. } else {
  96. // normal round, send work
  97. log.Printf("Sending %d", i)
  98. // send job
  99. tr.pwChan <- i
  100.  
  101. // add to counters
  102. i += 1
  103. tr.jobsProduced += 1
  104.  
  105. }
  106. // we finished doing our jobs, quit producing
  107. if i == tr.jobs {
  108. //log.Printf("Rondas done %d", i)
  109. break
  110. }
  111.  
  112. }
  113. end(tr.initTime, "PRODUCE")
  114. // make main wait for all to finish
  115. tr.doneProducing <- <-tr.doneReceiving
  116.  
  117. }
  118.  
  119. func (tr *Threader) work() {
  120. // the routine receives the data,
  121. // sleeps for a random time
  122. // and sends response to receiver (wrChan)
  123. var mi_rand int = rand.Intn(7)
  124. for {
  125. resp := <-tr.pwChan
  126. // do work
  127. tr.pwCounterChan <- 1
  128. if mi_rand%3 == 0 {
  129. //log.Printf("mi_rand %d", mi_rand)
  130. time.Sleep(10 * (time.Second))
  131. }
  132. tr.pwCounterChan <- -1
  133.  
  134. // rend response
  135. tr.wrChan <- resp
  136. }
  137. }
  138.  
  139. func (tr *Threader) receiver() {
  140.  
  141. // waits for msgs from workers
  142. for {
  143. u := <-tr.wrChan
  144. log.Printf("Received %d", u)
  145. // all workers finished, quit
  146. if u == (tr.jobs - 1) {
  147. break
  148. }
  149. }
  150. end(tr.initTime, "RECEIVE")
  151. tr.doneReceiving <- true
  152. }
  153.  
  154. ////
  155. // helpers
  156. ////
  157.  
  158. func moreThanTL(t time.Time) bool {
  159. elapsed := time.Since(t)
  160. if TIME_LIMIT < elapsed {
  161. return true
  162. }
  163. return false
  164. }
  165.  
  166. func end(t time.Time, s string) {
  167. elapsed := time.Since(t)
  168. log.Printf("%s took %s", s, elapsed)
  169. }
  170.  
  171. func random(min, max int) int {
  172. rand.Seed(time.Now().Unix())
  173. return rand.Intn(max-min) + min
  174. }
Add Comment
Please, Sign In to add comment