# chatserver4.py
import socket, threading
class server4(threading.Thread) :
def __init__(self, (socket, address) ):
threading.Thread.__init__(self)
self.SOCKET=socket
self.ADDRESS=address
def run(self) :
vector.append(self)
print 'Connected ', self.ADDRESS
while True :
From=self.SOCKET.recv(1024) # Read from client
if not From : break
for s in vector :
if s != self :
s.SOCKET.send(From)
self.SOCKET.close()
print 'Disconnected ', self.ADDRESS
vector.remove(self)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 888))
s.listen(4)
vector = []
while True : # Wait for connection/run server
server4( s.accept() ).start();
|
# chatserver5.py
import socket, threading
class server5(threading.Thread) :
def __init__(self, (socket, address) ):
threading.Thread.__init__(self)
self.SOCKET=socket
self.ADDRESS=address
def run(self) :
lock.acquire()
vector.append(self)
lock.release()
print 'Connected ', self.ADDRESS
while True :
From=self.SOCKET.recv(1024) # Read from client
if not From : break
for s in vector :
if s != self :
s.SOCKET.send(From)
self.SOCKET.close()
print 'Disconnected ', self.ADDRESS
lock.acquire()
vector.remove(self)
lock.release()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 888))
s.listen(4)
vector = []
lock=threading.Lock()
while True : # Wait for connection/run server
server5( s.accept() ).start();
|
Lock
When multiple threads have access to common data, the potential exists for corrupting the data when two threads attempt to modify the data simultaneously. Python implements locks in the threading module, the Lock() constructor creates an object that can be used to serialize access to a common data. The vector data is shared by all threads, vector.append() and vector.remove() are potential points of thread conflict. Each has been bracketed by a lock.acquire() and lock.release() to restrict access to vector to a single thread at a time.