2017-08-18 7 views
0

Pour un système d'alerte d'inondation, mon Raspberry Pi sonne les cloches en temps quasi réel mais utilise un lecteur NAS comme boîte aux lettres pour envoyer des fichiers de données à un PC pour des graphiques et des rapports plus lents. arrière. Python sur le Pi prend exactement 10 secondes pour établir que le lecteur NAS juste à côté n'est pas disponible actuellement. J'ai besoin que cela se produise en moins d'une seconde pour chaque tentative d'accès, sinon les retards s'ajoutent et le Pi ne parvient pas à actualiser le chien de garde matériel dans le temps. (Le Pi effectue des tâches sur un cycle fixe: toutes les secondes, toutes les 15 secondes (watchdog), toutes les 75 secondes et toutes les 10 minutes.) Toutes les tentatives d'accès au disque sont précédées de tests avec try-except. Mais try-except ne vous aide pas, car des tests comme os.path.exists() ou open() prennent tous les deux 10 secondes avant de déclencher l'exception, même lorsque le disque NAS est éteint. C'est comme s'il y avait un délai d'expiration de 10 secondes dans le protocole de communication plutôt que dans le logiciel.Comment Python peut-il tester la disponibilité d'un disque NAS très rapidement?

Y a-t-il une façon de dire essayer, sauf de ne pas être si patient? Sinon, comment puis-je obtenir un indicateur plus immédiat de la capacité du lecteur NAS à maintenir le Pi à la prochaine lecture/écriture, afin que le Pi puisse abandonner et attendre le prochain cycle? J'ai fait toutes les files d'attente pour cela, mais c'est gaspillé si chaque vérification prend 10 secondes.

+0

Pourriez-vous élaborer sur ce que vous essayez d'accomplir et ce que vous avez déjà essayé. Aussi, il suffit d'écrire «Je dois arriver en moins d'une seconde», c'est un peu trop large pour être utile. – Arminius

+0

J'ai fait quelques modifications avec plus de détails - j'espère que cela clarifie –

+0

Maintenant, je pense que je comprends mieux le problème. Y at-il une raison pour laquelle vous n'utilisez pas n'importe quelle forme de file d'attente sur le Pi pour vous assurer que les messages sont écrits indépendamment du statut de veille du NAS? Si je comprends bien votre question, ce script Python a une seconde pour terminer sa tâche. Alors pourquoi ne pas utiliser un second script dans la file d'attente des messages? Quelque chose comme utiliser le protocole MQTT avec un courtier MQTT pour le Pi. – Arminius

Répondre

0

Prendre MQTT à ce stade serait un grand changement pour ce projet presque terminé. Mais votre suggestion de découpler le Python en temps quasi-réel du lecteur NAS en utilisant un deuxième script est la voie à suivre. Si les commandes de l'interface du disque Python attendent une réponse pendant 10 secondes, je ne peux pas m'en empêcher. Mais je peux l'arrêter en retardant les fonctions critiques de Python en gardant tous les accès aux fichiers critiques dans la mémoire Pi, et en répliquant des fichiers entiers dans les deux sens entre le Pi et le NAS à chaque changement. En fait, j'ai déjà le code du réplicateur opportuniste en Python - j'ai juste besoin de le sortir du script principal temps-critique dans un script séparé qui va répliquer les fichiers. Et le script Python du réplicateur fera l'attente, plutôt que le script Python critique. Le planificateur Pi va découpler les deux scripts pour moi. Merci pour votre aide - je commençais à désespérer!

+0

Oui, cela a fonctionné. L'arrêt du lecteur NAS retarde le script Python du réplicateur, mais le script Python, critique dans le temps, continue de fonctionner et met en file d'attente ses fichiers de sortie. Tout rattrape à nouveau lorsque le disque NAS revient. Super pour bénéficier de votre aide Arminius. Andrew –