2010-12-17 7 views
2

Ich schreibe gerade ein Nginx-Proxy-Server-Modul mit einer Anfrage-Warteschlange vor, so dass die Anfragen nicht fallen, wenn die Server hinter dem Nginx die Anfragen nicht behandeln können (Nginx ist konfiguriert als Lastausgleicher).Python Freigeben eines Netzwerk Sockets mit Multiprocessing.Manager

I

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler 

Die Idee bin mit ist die Anforderung in eine Warteschlange zu stellen, bevor Umgang mit ihnen. Ich kenne multiprocessing.Queue unterstützt nur einfaches Objekt und kann rohe Sockets nicht unterstützen, also versuchte ich, einen multiprocess.Manager zu benutzen, um ein geteiltes Wörterbuch zu bilden. Der Manager verwendet auch Sockets für die Verbindung, daher ist diese Methode ebenfalls fehlgeschlagen. Gibt es eine Möglichkeit, Netzwerk-Sockets zwischen Prozessen zu teilen? Hier ist der problematischste Teil des Codes:

class ProxyServer(Threader, HTTPServer): 

    def __init__(self, server_address, bind_and_activate=True): 
     HTTPServer.__init__(self, server_address, ProxyHandler, 
       bind_and_activate) 

     self.manager = multiprocessing.Manager() 

     self.conn_dict = self.manager.dict() 
     self.ticket_queue = multiprocessing.Queue(maxsize= 10) 
     self._processes = [] 
     self.add_worker(5) 


    def process_request(self, request, client): 
     stamp = time.time() 
     print "We are processing" 

     self.conn_dict[stamp] = (request, client) # the program crashes here 


    #Exception happened during processing of request from ('172.28.192.34', 49294) 
    #Traceback (most recent call last): 
    # File "/usr/lib64/python2.6/SocketServer.py", line 281, in _handle_request_noblock 
    # self.process_request(request, client_address) 
    # File "./nxproxy.py", line 157, in process_request 
    # self.conn_dict[stamp] = (request, client) 
    # File "<string>", line 2, in __setitem__ 
    # File "/usr/lib64/python2.6/multiprocessing/managers.py", line 725, in _callmethod 
    # conn.send((self._id, methodname, args, kwds)) 
    #TypeError: expected string or Unicode object, NoneType found 

     self.ticket_queue.put(stamp) 


    def add_worker(self, number_of_workers): 
     for worker in range(number_of_workers): 
      print "Starting worker %d" % worker 
      proc = multiprocessing.Process(target=self._worker, args = (self.conn_dict,)) 
      self._processes.append(proc) 
      proc.start() 

    def _worker(self, conn_dict): 
     while 1: 
      ticket = self.ticket_queue.get() 

      print conn_dict 
      a=0 
      while a==0: 
       try: 
        request, client = conn_dict[ticket] 
        a=1 
       except Exception: 
        pass 
      print "We are threading!" 
      self.threader(request, client) 

Antwort

0

Sieht aus wie Sie pass file descriptors zwischen Prozessen benötigen (Unix unter der Annahme, keine Ahnung über Windows hier). Ich habe das noch nie in Python gemacht, aber hier ist ein Link zu python-passfd Projekt, das Sie überprüfen möchten.

7

U kann multiprocessing.reduction verwenden, um die Verbindung und Socket-Objekte zwischen Prozessen

Beispielcode

# Main process 
from multiprocessing.reduction import reduce_handle 
h = reduce_handle(client_socket.fileno()) 
pipe_to_worker.send(h) 

# Worker process 
from multiprocessing.reduction import rebuild_handle 
h = pipe.recv() 
fd = rebuild_handle(h) 
client_socket = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM) 
client_socket.send("hello from the worker process\r\n") 
+1

das ist, was ich suchte nach seiner nicht gut auf der Python-Website dokumentiert – WojonsTech

0

Sie an diesem Code aussehen kann übertragen - https://gist.github.com/sunilmallya/4662837 die multiprocessing.reduction Socket-Server mit den Eltern ist Verarbeitung Passing-Verbindungen zum Client nach dem Akzeptieren von Verbindungen

Verwandte Themen