Python: Nicht blockierenden socket oder Asynchronos I/O

Ich bin neu in Python und aktuell zu schreiben, ein python-socket laufen, ein Skript, die die Kommunikation mit einem Gerät über TCP/IP (Wetter-station).

Das Gerät fungiert als Server-Seite (hören über IP:PORT verbindungen akzeptiert, Empfang-Anfrage, die übertragung von Daten).

Ich brauche nur eine Nachricht senden, die Antwort empfangen und dann friedlich und schön abschalten und schließen Sie den socket.

try:
    comSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
    sys.stderr.write("[ERROR] %s\n" % msg[1])
    sys.exit(1)

try:
   comSocket.connect((''))
except socket.error, msg:
   sys.stderr.write("[ERROR] %s\n" % msg[1])
   sys.exit(2)

comSocket.send('\r')
comSocket.recv(128)
comSocket.send('\r')
comSocket.recv(128)
comSocket.send('\r\r')
comSocket.recv(128)

comSocket.send('1I\r\r3I\r\r4I\r\r13I\r\r5I\r\r8I\r\r7I\r\r9I\r\r')

rawData = comSocket.recv(512)

comSocket.shutdown(1)
comSocket.close()

Das problem das ich habe ist:

Der Kommunikationskanal ist unzuverlässig, das Gerät ist langsam. Also, manchmal die Reaktion des Geräts mit der Meldung der Länge 0 (nur ACK), die meinen code friert ein und warte auf die Antwort ewig.

Dieses Stück code enthält, der Teil, der beinhaltet, SOCKET, der ganze code wird ausgeführt unter CRON, also das einfrieren ist kein erwünschtes Verhalten.

Meine Frage ist:

Was wäre die beste Art und Weise, in Python zu handhaben, dass Verhalten, so dass der code nicht frieren und ewig warten, sondern versuchen sich zu bewegen auf die nächste zu schicken (oder so).

  • Sie sollten einen Blick auf die Verdreht - Bibliothek für Python. Es ist ein framework für die asynchrone Vernetzung würde, dass diese viel einfacher.
  • Während der Verwendung der Twisted-Bibliothek arbeiten können, eine ganze Bibliothek für eine Nachricht scheint ein wenig übertrieben. Vielleicht benötigen Sie CRON öffnen Sie ein Teilprozess mit Ihrer socket-Kommunikation in einem separaten thread. Auf diese Weise werden Sie vermeiden Sie die Blockierung Problem.
  • da habe ich ähnliche Frage, zu der eine gepostet. Verdreht sich nicht für die Server-Seite? Wie es zu ändern, um den Einsatz auf client-Seite?
  • diese sind nicht grundsätzlich verschiedene Szenarien, beide sind CLI Python
InformationsquelleAutor Tu Hoang | 2011-06-16
Schreibe einen Kommentar