Skip to content

Instantly share code, notes, and snippets.

@WinnerOK
Last active September 25, 2020 05:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save WinnerOK/a09160c11f7b087404bb45deadd27e0b to your computer and use it in GitHub Desktop.
Save WinnerOK/a09160c11f7b087404bb45deadd27e0b to your computer and use it in GitHub Desktop.
Vector clock implementation
from multiprocessing import Process, Pipe
from os import getpid
from datetime import datetime
from time import sleep
def local_time(counter):
return '| (VECTOR_TIME={}, LOCAL_TIME={})'.format(counter, datetime.now())
def calc_recv_timestamp(recv_time_stamp, counter):
for id in range(len(counter)):
counter[id] = max(recv_time_stamp[id], counter[id])
return counter
def event(pid, counter):
counter[pid] += 1
print('Something happened in {} !'.\
format(pid) + local_time(counter))
return counter
def send_message(pipe, pid, counter):
counter[pid] += 1
pipe.send(('Empty shell', counter))
print('Message sent from ' + str(pid) + local_time(counter))
return counter
def recv_message(pipe, pid, counter):
counter[pid] += 1
message, timestamp = pipe.recv()
counter = calc_recv_timestamp(timestamp, counter)
print('Message received at ' + str(pid) + local_time(counter))
return counter
def report_counter(pid, counter):
print("="*100 + f"Process {pid} has counter {counter}")
def processA(pipeAB):
pid = 0
counter = [0, 0, 0]
counter = send_message(pipeAB, pid, counter) # a0 -> b0
counter = send_message(pipeAB, pid, counter) # a1 -> b1
counter = event(pid, counter) # a2
counter = recv_message(pipeAB, pid, counter) # b2 -> a3
counter = event(pid, counter) # a4
counter = event(pid, counter) # a5
counter = recv_message(pipeAB, pid, counter) # b5 -> a6
report_counter(pid, counter)
def processB(pipeBA, pipeBC):
pid = 1
counter = [0, 0, 0]
counter = recv_message(pipeBA, pid, counter) # a0 -> v0
counter = recv_message(pipeBA, pid, counter) # a1 -> b1
counter = send_message(pipeBA, pid, counter) # b2 -> a3
counter = recv_message(pipeBC, pid, counter) # c0 -> b3
counter = event(pid, counter) # b4
counter = send_message(pipeBA, pid, counter) # b5 -> a6
counter = send_message(pipeBC, pid, counter) # b6 -> c1
counter = send_message(pipeBC, pid, counter) # b7 -> c3
report_counter(pid, counter)
def processC(pipeCB):
pid = 2
counter = [0, 0, 0]
counter = send_message(pipeCB, pid, counter) # c0 -> b3
counter = recv_message(pipeCB, pid, counter) # b6 -> c1
counter = event(pid, counter) # c2
counter = recv_message(pipeCB, pid, counter) # b7 -> c3
report_counter(pid, counter)
if __name__ == '__main__':
AB, BA = Pipe()
BC, CB = Pipe()
process1 = Process(target=processA, args=(AB,))
process2 = Process(target=processB, args=(BA, BC))
process3 = Process(target=processC, args=(CB,))
process1.start()
process2.start()
process3.start()
process1.join()
process2.join()
process3.join()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment