Python: socket Non bloquant ou Asynchronos I/O

Je suis nouveau sur le Python et actuellement à l'écriture d'un python de socket pour être exécuté comme un script qui communique avec un périphérique via TCP/IP (station météo).

L'appareil agit comme le Côté Serveur (d'écoute sur IP:PORT, accepte la connexion, la réception de la demande, le transfert de données).

J'ai seulement besoin d'envoyer un message, recevoir la réponse et ensuite paisiblement et agréablement à l'arrêt et de fermer le 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()

Le problème, je vais avoir est:

Le canal de communication n'est pas fiable, l'appareil est lent. Donc, parfois, le dispositif de réponse avec un message de longueur 0 (juste un accusé de réception), mon code va geler et attendre la réponse à jamais.

Ce morceau de code est constitué de la partie qui implique la PRISE, tout le code sera exécuté sous CRON et le gel n'est pas un comportement souhaitable.

Ma question est:

Quelle serait la meilleure façon Python pour gérer ce comportement, de sorte que le code ne gèle pas et d'attendre éternellement, mais va tenter de passer à la suivante envoyer (ou ces).

Vous devriez regarder les Twisted bibliothèque pour Python. C'est un cadre pour réseau asynchrone ce qui ferait beaucoup plus facile.
Tout en utilisant le Tordu à la bibliothèque de travail, une bibliothèque entière pour un message semble un peu exagéré. Peut-être vous avez besoin d'avoir CRON ouvrir un sous-processus avec votre communication par socket passe dans un thread séparé. De cette façon, vous éviterez le problème de blocage.
depuis que j'ai la même question à celui affiché. Est Tordu n'est pas conçu pour le Serveur? Comment le modifier pour l'utiliser sur le côté client?
ces ne sont pas fondamentalement différents scénarios, les deux sont CLI Python

OriginalL'auteur Tu Hoang | 2011-06-16