我正在python中实现Lamports逻辑时钟算法。因此,我必须在同一台计算机上创建三个进程{process1.py,process2.py,process3.py}并同时并行运行它们进程将事件多播到所有其他进程。我正在使用shell脚本并行运行这些python文件。我正在使用套接字通过不同的端口在它们之间建立通信。这三个进程的代码保持相同,只是它们在不同的端口上侦听消息。 由于所有过程都相同,并且同时启动通信,因此出现错误“连接被拒绝”。我知道在客户端与服务器通信的情况下服务器不启动时可能会发生这种情况。但就我而言,所有组件都是服务器。任何帮助将不胜感激。
process1.py
import socket
import math
import time
import threading
class process1:
# send message to p2 and p3.
def send_message(self):
buffer = [1.1]
ack_buf = []
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(True)
sock.bind(('localhost',6000))
sock.connect(('localhost',6001))
message1 = {'payload' : 1.1}
sock.send(str(message1).encode('utf8'))
data = sock.recv(1024)
var = eval(data.decode('utf8'))
if 'payload' in var:
buffer.append(var['payload'])
threading.Thread(target=self.send_ack, args = (var['payload'], sock)).start()
elif 'ack' in var:
ack_buf.append(var['ack'])
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('localhost', 6002))
s.send(str(message1).encode('utf8'))
data_recv = sock.recv(1024)
var = eval(data_recv.decode('utf8'))
if 'payload' in var:
buffer.append(var['payload'])
threading.Thread(target=self.send_ack, args = (var['payload'], s)).start()
elif 'ack' in var:
ack_buf.append(var['ack'])
self.print_events(buffer)
self.validate(buffer, ack_buf)
# sends acknowlegment to all the processes in the distributed system.
def send_ack(self,event, socket):
if event>0 and socket is not None:
socket.send(str({'ack':event}).encode('utf8'))
# prints the events in the sorted order
def print_events(self,buffer):
sorted(buffer)
for x in range(len(buffer)):
m = buffer[x]
frac, whole = math.modf(m)
each_event = int(frac*10)
print('Event %d of process %d is happening according to the received order'%(each_event, whole))
# validates if the msgs sent are received by the processes
def validate(self, list_of_events, recv_buf):
count = 0
if len(list_of_events) > 0 and len(recv_buf) > 0:
for x in range(len(list_of_events)):
if list_of_events[x] in recv_buf:
count += 1
if count == 2:
print("Event %d is sent and acknowledged by the other processes"%(list_of_events[x]))
if __name__ == "__main__":
p1 = process1()
time.sleep(.300)
threading.Thread(target=p1.send_message).start()
process2.py
import socket
import math
import time
import threading
class process2:
# send message to p2 and p3.
def send_message(self):
buffer = [1.1]
ack_buf = []
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(True)
sock.bind(('localhost',6001))
time.sleep(.300)
sock.connect(('localhost',6000))
message1 = {'payload' : 2.1}
sock.send(str(message1).encode('utf8'))
data = sock.recv(1024)
var = eval(data.decode('utf8'))
if 'payload' in var:
buffer.append(var['payload'])
threading.Thread(target=self.send_ack, args = (var['payload'], sock)).start()
elif 'ack' in var:
ack_buf.append(var['ack'])
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
time.sleep(.300)
s.connect(('localhost', 6002))
s.send(str(message1).encode('utf8'))
data_recv = sock.recv(1024)
var = eval(data_recv.decode('utf8'))
if 'payload' in var:
buffer.append(var['payload'])
threading.Thread(target=self.send_ack, args = (var['payload'], s)).start()
elif 'ack' in var:
ack_buf.append(var['ack'])
self.print_events(buffer)
self.validate(buffer, ack_buf)
# sends acknowlegment to all the processes in the distributed system.
def send_ack(self, event, socket):
if event>0 and socket is not None:
socket.send(str({'ack':event}).encode('utf8'))
# prints the events in the sorted order
def print_events(self, buffer):
sorted(buffer)
for x in range(len(buffer)):
m = buffer[x]
frac, whole = math.modf(m)
each_event = int(frac*10)
print('Event %d of process %d is happening according to the received order'%(each_event, whole))
# validates if the msgs sent are received by the processes
def validate(self, list_of_events, recv_buf):
count = 0
if len(list_of_events) > 0 and len(recv_buf) > 0:
for x in range(len(list_of_events)):
if list_of_events[x] in recv_buf:
count += 1
if count == 2:
print("Event %d is sent and acknowledged by the other processes"%(list_of_events[x]))
if __name__ == "__main__":
p2 = process2()
time.sleep(.300)
threading.Thread(target=p2.send_message).start()
process3.py
import socket
import math
import time
import threading
class process3:
# send message to p2 and p3.
def send_message(self):
buffer = [1.1]
ack_buf = []
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(True)
sock.bind(('localhost',6002))
sock.connect(('localhost',6000))
message1 = {'payload' : 3.1}
sock.send(str(message1).encode('utf8'))
data = sock.recv(1024)
var = eval(data.decode('utf8'))
if 'payload' in var:
buffer.append(var['payload'])
threading.Thread(target=self.send_ack, args = (var['payload'], sock)).start()
elif var.has_key('ack'):
ack_buf.append(var['ack'])
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
time.sleep(.300)
s.connect(('localhost', 6001))
s.send(str(message1).encode('utf8'))
data_recv = sock.recv(1024)
var = eval(data_recv.decode('utf8'))
if 'payload' in var:
buffer.append(var['payload'])
threading.Thread(target=self.send_ack, args = (var['payload'], s)).start()
elif 'ack' in var:
ack_buf.append(var['ack'])
self.print_events(buffer)
self.validate(buffer, ack_buf)
# sends acknowlegment to all the processes in the distributed system.
def send_ack(self, event, socket):
if event>0 and socket is not None:
socket.send(str({'ack':event}).encode('utf8'))
# prints the events in the sorted order
def print_events(self, buffer):
sorted(buffer)
for x in range(len(buffer)):
m = buffer[x]
frac, whole = math.modf(m)
each_event = int(frac*10)
print('Event %d of process %d is happening according to the received order'%(each_event, whole))
# validates if the msgs sent are received by the processes
def validate(self, list_of_events, recv_buf):
count = 0
if len(list_of_events) > 0 and len(recv_buf) > 0:
for x in range(len(list_of_events)):
if list_of_events[x] in recv_buf:
count += 1
if count == 2:
print("Event %d is sent and acknowledged by the other processes"%(list_of_events[x]))
if __name__ == "__main__":
p3 = process3()
time.sleep(.300)
threading.Thread(target=p3.send_message).start()
job.sh
python3 process1.py& python3 process2.py和 python3 process3.py&