# 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.