Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Distributed
- global numWorkers = 5
- addprocs(numWorkers)
- @everywhere function workerInit(_size, firstLeader)
- global workload = round(rand(), digits = 1)
- global workloads = Vector{Float64}(undef, _size)
- global part = false
- global currLeader = firstLeader
- global size = _size
- work()
- end
- @everywhere function work()
- while true
- if !part
- updateWorkload()
- end
- sleep(2)
- println("Workloads: $(workloads)")
- electionInit()
- end
- end
- @everywhere function updateWorkload()
- global workload = round(rand(), digits=1)
- id = myid()
- for w in workers()
- @spawnat(w, setWorkload(id, workload))
- end
- end
- @everywhere function setWorkload(id, newWorkload)
- global workloads[id-1] = newWorkload
- end
- @everywhere function electionInit()
- id = myid()
- if !part && workloads[currLeader-1] >= 0.8 && workloads[id-1] < 0.8
- global part = true
- local next = ((id-1)%size)+2
- id = myid()
- @spawnat next election(workloads[id-1], id, id)
- end
- end
- @everywhere function election(best, bestId, starterId)
- id = myid()
- next = ((id-1)%size)+2
- if id != starterId
- global part = true
- if (best > workloads[id-1]) || (best == workloads[id-1] && id > bestId)
- @spawnat next election(workloads[id-1], id, starterId)
- else
- @spawnat next election(best, bestId, starterId)
- end
- else
- for w in workers()
- @spawnat w updateLeader(bestId)
- end
- end
- end
- @everywhere function updateLeader(newLeader)
- if part
- id = myid()
- global part = false
- if id == newLeader
- println("New leader elected! Worker $(id)")
- end
- global currLeader = newLeader
- end
- end
- @sync for w in workers()
- @spawn workerInit(numWorkers, 2)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement