Je suis nouveau à Python et je dois actuellement écrire une prise Python pour être exécutée en tant que script qui communique avec un appareil sur TCP / IP (une station météo). Le problème que j'ai est: strong> Ma question est la suivante: strong>
L'appareil sert de côté serveur (écoutant sur IP: port, acceptation de connexion, demande de réception, transfert de données).
Il suffit d'envoyer un message, de recevoir la réponse, puis de l'arrêt paisiblement et joliment et fermez la prise.
Le canal de communication n'est pas fiable, l'appareil est lent. Donc, parfois, la réponse du périphérique avec le message de longueur 0 (juste un ack), le mon code gelera et attendra la réponse pour toujours.
Ce morceau de code contient la partie qui implique une prise, l'ensemble du code sera exécuté sous le cron afin que la congélation n'est pas un comportement souhaitable. P>
Quelle serait la meilleure façon de python de gérer ce comportement, de sorte que le code ne gèle pas et attendra pour toujours, mais tentera de passer à la prochaine envoi (ou de telle). P> P>
3 Réponses :
Essayez, avant de recevoir, mettez un délai d'attente sur la prise:
comSocket.settimeout(5.0) try: rawData = comSocket.recv(512) except socket.timeout: print "No response from server"
Je recommanderais d'événements et de threads vert pour cela. P>
Twisted est une bonne bibliothèque mais une petite courbe d'apprentissage escarpée pour un cas d'utilisation aussi simple. P>
Consultez quelques exemples ici . P>
Vous pouvez essayer une approche de délai d'attente, comme le code Russel ou vous pouvez utiliser une prise non bloquante, comme indiqué dans le code ci-dessous. Il ne bloquera jamais à socket.recv code> et vous pouvez l'utiliser à l'intérieur d'une boucle pour réessayer autant de fois que vous le souhaitez. De cette façon, votre programme ne sera pas suspendu au délai d'attente. De cette façon, vous pouvez tester si des données sont disponibles et si non, vous pouvez faire d'autres choses et réessayer plus tard.
Vous devriez consulter le Bibliothèque Twisted pour Python. C'est un cadre pour la mise en réseau asynchrone qui faciliterait beaucoup cela.
Bien que l'utilisation de la bibliothèque tordue puisse fonctionner, une bibliothèque entière pour un message semble un peu surchargée. Peut-être avez-vous besoin d'ouvrir Cron Ouvrir une sous-processus avec votre communication de prise dans un fil séparé. De cette façon, vous éviterez le problème de blocage.
@Andrea depuis que j'ai une question similaire à celle postée. Est torsadé non conçu pour le côté serveur? Comment la modifier pour utiliser le côté du client?
@Hangon Ce ne sont pas des scénarios intrinsèquement différents, les deux sont cli python