title: Multiple processes sharing a listening socket: When a new process enters why does the old one stop?
body: <blockquote>
    <p>These code is the Server part of my proxy program, and its function is creating the socket and fork four process to accept one by one. </p>
    
    <p>In my program I use gevent model to dispatch all my function and before I alter it to multiple process, my program is all right. but now when I use the second process, the first one stop running, I don't find where is wrong, maybe the 'accept' function or my event is stop dispatch. </p>
    
    <p>It have already bothered me for two days I hope someone can help me. </p>
    
    <p>BTW, my English is poor, I try my best to explain it, hoping you can understand.  </p>
  </blockquote>
  
  <pre><code> class Client(object):
      def __init__(self, ent, ev):
          ...  
  
      def receive( self ):
          ...
          if "Content-Length" in dic:
              self.ent_s_send = core.event(core.EV_WRITE,
                                           self.conn.fileno(),
                                           self.ser_send,
                                           [self.conn,self.body]
                                           )
              self.recv_ent = core.event(core.EV_READ, 
                                         self.sock.fileno(),
                                         self.recv_content
                                        )
              self.recv_ent.add()
          ...
  
      def recv_content(self, ent, ev):
          ...
          self.n = self.sock.recv_into(self.msg,
                                       min(self.total-self.num, 20000),
                                       socket.MSG_DONTWAIT)
  
          **time.sleep(0.1)**  
          #if i add it here to let the event slow down the problem solved, how it could be? 
  
          self.num += self.n
          self.msg_buffer.fromstring(self.msg.tostring()[:self.n])
          ...
          if self.total &gt; self.num:  #if not the last msg continue recving and sending...
              self.ent_s_send.add()
              self.recv_ent.add()
          ...
  
      def ser_send(self, ent, ev):
          ...
          num = self.conn.send(self.msg_buffer,socket.MSG_DONTWAIT)
          ...
          self.msg_buffer = self.msg_buffer[num:]
  
   ...
   ...
  
   class Server(object):
      def __init__( self ):
          self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          self.sock.bind(('localhost', 18001))
          self.sock.listen(50)
          self.mutex = multiprocessing.Lock()
  
      def loop( self, ):
  
          for i in range(0,4):
              pid = os.fork()
              if pid == 0 or pid == -1:
                  break
  
          if pid == -1:
              print "Fork failed!!!"
              sys.exit()
  
          elif pid == 0:   **# create four child ps to accept the socket!**
              print "Child  PID =  %d" % os.getpid()
              core.init()
              self.event = core.event(core.EV_READ,
                                  self.sock.fileno(),
                                  self.onlink)
              self.event.add()
              core.dispatch()
  
          else:
              os.wait()
  
      def onlink( self, ent, ev):
          self.mutex.acquire()
          print 'Accept PID = %s' % os.getpid()
          try:
              self.conn, self.addr = self.sock.accept()   
              **#I think 'accept' is the the problem, but I cannot see how.** 
  
          except socket.error, why:
              if why.args[0] in [ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED]:
                  return
              else:
                  raise
          print self.sock,self.conn,self.addr
          self.mutex.release()
          print 'Release PID = %s' % os.getpid()
          cc = Chat( self.conn, self.sock )
          self.event.add()
  
  
  
  if __name__ == '__main__':
  
      s1 = Server()
      s1.loop()
  </code></pre>