Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 2.13 KB | None | 0 0
  1. using Distributed
  2. global numWorkers = 5
  3. addprocs(numWorkers)
  4.  
  5. @everywhere function workerInit(_size, firstLeader)
  6.         global workload = round(rand(), digits = 1)
  7.         global workloads = Vector{Float64}(undef, _size)
  8.         global part = false
  9.         global currLeader = firstLeader
  10.         global size = _size
  11.         work()
  12.     end
  13.  
  14. @everywhere function work()
  15.         while true
  16.             if !part
  17.                 updateWorkload()
  18.             end
  19.             sleep(2)
  20.             println("Workloads: $(workloads)")
  21.             electionInit()
  22.         end
  23.     end
  24.  
  25. @everywhere function updateWorkload()
  26.         global workload =  round(rand(), digits=1)
  27.         id = myid()
  28.         for w in workers()
  29.             @spawnat(w, setWorkload(id, workload))
  30.         end
  31.     end
  32.  
  33. @everywhere function setWorkload(id, newWorkload)
  34.         global workloads[id-1] = newWorkload
  35.     end
  36.  
  37. @everywhere function electionInit()
  38.         id = myid()
  39.         if !part && workloads[currLeader-1] >= 0.8 && workloads[id-1] < 0.8
  40.             global part = true
  41.             local next = ((id-1)%size)+2
  42.             id = myid()
  43.             @spawnat next election(workloads[id-1], id, id)
  44.         end
  45.     end
  46.  
  47. @everywhere function election(best, bestId, starterId)
  48.         id = myid()
  49.         next = ((id-1)%size)+2
  50.         if id != starterId
  51.             global part = true
  52.             if (best > workloads[id-1]) || (best == workloads[id-1] && id > bestId)
  53.                 @spawnat next election(workloads[id-1], id, starterId)
  54.             else
  55.                 @spawnat next election(best, bestId, starterId)
  56.             end
  57.         else
  58.             for w in workers()
  59.                 @spawnat w updateLeader(bestId)
  60.             end
  61.         end
  62.     end
  63.  
  64. @everywhere function updateLeader(newLeader)
  65.         if part
  66.             id = myid()
  67.             global part = false
  68.             if id == newLeader
  69.                 println("New leader elected! Worker $(id)")
  70.             end
  71.             global currLeader = newLeader
  72.         end
  73.     end
  74.  
  75. @sync for w in workers()
  76.     @spawn workerInit(numWorkers, 2)
  77. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement