Last active
September 25, 2020 05:07
-
-
Save WinnerOK/a09160c11f7b087404bb45deadd27e0b to your computer and use it in GitHub Desktop.
Vector clock implementation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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