Frage

Nur für den Anfang habe ich Twisted und SocketServer mit ForkMixIn und ThreadMixIn verwendet und die „Thread-Pool“-Rezepte ausprobiert.

Ich wollte jedoch, dass etwas Bestimmtes in Python funktioniert.

Kleiner Hintergrund.Zuvor habe ich in C einen einfachen TCP-Deamon geschrieben, der sich an einen Socket bindet und darauf lauscht, dann X viele Male vorforkt und dann einfach den Serversocket-Desc an alle Forks weitergibt, und jeder würde die Clients sehr, sehr gut akzeptieren.

Ich habe mir den auf „Select/Poll“ basierenden Asynccore angesehen, der mir sehr gut gefällt.Mein einziges Manko war, dass ich durch ein paar Forks ein wenig CPU entlasten konnte, um die Multi-CPU-Maschine zu nutzen und bei der Planung auf das Beste zu hoffen.

Ich schaffe es nicht, dass es für mein Leben funktioniert.Nur eine einzelne Instanz kann Verbindungen akzeptieren, alle anderen lösen bei der Verarbeitung der Verbindung einfach eine Ausnahme aus: „Kann nicht durch Empty iterieren“.

ist das überhaupt machbar?Ich habe viel nachgeschaut, aber ich konnte KEINEN Code zum Forken von Asynccore-Dispatchern finden (heul)

Danke schön!

Update 1:(Vollständige Rückverfolgung wie gewünscht)

error: uncaptured python exception, closing channel <__main__.EchoServer listening 0.0.0.0:8001 at 0x2ad4880c93f8> (<type 'exceptions.TypeError'>:'NoneType' /python2.6/asyncore.py|readwrite|99] [/usr/local/python2.6.9/lib/python2.6/asyncore.py|handle_read_event|408] [./6py-server.py|handle_accept|87])

Passiert immer beim Akzeptieren, unabhängig davon, ob ich vor der asyncore.loop usw. forke.

Update 2:(vollständige Quelle) Pastebined-Quelle

War es hilfreich?

Lösung

Sie sollten Code-Markup für die Rückverfolgung verwenden, andernfalls wird es fehlerhaft angezeigt und wir sehen den Ausnahmetyp nicht.

Aber ich glaube, dass es so ist TypeError: 'NoneType' object is not iterable seit self.accept() kann zurückkehren None.Der Grund dafür ist, dass mehrere Prozesse ein Leseereignis für den Listening-Socket erhalten können, es aber nur einer akzeptieren kann.Die restlichen Prozesse werden erhalten EWOULDBLOCK Fehler, der abgefangen wird, dann aber zurückkehrt None statt Verbindungs-Adress-Paar.

Ändere dein handle_accept() sofort zurückkehren, wenn accept() kehrt zurück None.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top