6
votes

Interagir avec script de python à long terme

J'ai un long script Python qui collecte des tweets de Twitter, et j'aimerais savoir comment ça se fait de temps en temps.

Actuellement, j'utilise le signal code> la bibliothèque code> pour attraper Interruption, à quel point j'appelle ma fonction d'impression. Quelque chose comme ceci: p> xxx pré>

et chaque fois que je veux mes informations, j'ouvre un nouveau terminal et émettez mon interruption: p>

$kill -USR1 <pid>


6 commentaires

Cela semble être une bibliothèque de signaux d'utilisation applicable. Pourquoi pensez-vous qu'il y a une meilleure façon?


Vous pouvez avoir le fil d'écoute sur une prise pour connexions, puis écrivez des informations sur la prise lorsqu'un client se connecte.


@MRALIAS Je prévois d'avoir plus d'une méthode "impression" et de ce que je peux dire, il y a une interruption finie que je peux utiliser, j'ai donc pensé qu'il y avait peut-être un moyen différent d'interagir avec mon programme pendant l'exécution.


S'il n'y a qu'une seule ou quelques commandes, je pense que le signal suffit. Mais si vous avez beaucoup de commandes différentes, je préférerai utiliser un thread Écouter sur une prise ou simplement lire un fichier pour accepter des commandes.


Il pourrait être utile de savoir que signal.signal envoie à la fois le numéro de signal ainsi que le cadre et vous pouvez extraire des informations de la trame, telles que les variables globales et locales (éventuellement tweet_counts et autres objets d'état souhaités et autres objets d'état souhaités. ...). Sinon, si vous aimez l'idée d'enregistrer des informations sur un fichier, le Le journalisation le module serait Soyez une bonne option.


RSYNC utilise l'approche USR1 , pour référence. Votre question est-elle en fait comment interagir lorsque vous avez besoin de plusieurs façons d'interagir ou d'obtenir le statut? Le texte de la question ne semble pas correspondre au titre.


6 Réponses :


0
votes

J'écris personnellement des informations dans un fichier afin que je l'ai ensuite, bien que cela puisse être désavantagé d'être légèrement plus lent, car il doit écrire dans un fichier à chaque fois ou toutes les fois, il récupère un tweet.

Quoi qu'il en soit, si vous l'écrivez à un fichier "sortie.txt" , vous pouvez ouvrir bash et soit de type dans sortie de la queue.txt Pour les 10 dernières lignes imprimées dans le fichier ou que vous pouvez taper queue -f sortie.txt , qui met en vedette en continu l'invite de terminal avec les lignes que vous écrivez dans le fichier. Si vous souhaitez arrêter, juste ctrl-C .


0 commentaires

0
votes

Voici un exemple de programme à long terme qui maintient également une prise d'état. Lorsqu'un client se connecte à la prise, le script écrit certaines informations d'état à la prise.

$ socat - unix:/var/tmp/myprog.sock
1403061693.06 6 152


0 commentaires

0
votes

J'avais déjà écrit une application similaire auparavant.

Voici ce que j'ai fait:

Lorsqu'il n'y a que quelques commandes nécessaires, j'utilise simplement le signal comme vous l'avez fait, juste pour ne pas le rendre trop compliqué. Par commande, je veux dire quelque chose que vous souhaitez que vous appliquez, telle que print_info dans votre message.

Mais lorsque l'application est mise à jour, vous devez utiliser plus de commandes différentes, j'ai commencé à utiliser une écoute de fil spéciale sur un port de socket ou à la lecture d'un fichier local pour accepter des commandes. Supposons que l'application doit prendre en charge prinf_info1 print_info2 print_info3 , vous pouvez donc utiliser un client connecté au port cible et écrire print_info1 Pour faire exécuter la commande exécutée print_info1 (ou simplement écrire print_info1 dans un fichier local si vous utilisez le mécanisme de fichier local de lecture).

Lorsque vous utilisez l'écoute sur un mécanisme de port de socket, l'inconvénient est qu'il faudra un peu plus de travail pour écrire un client pour donner des commandes, l'avantage est que vous pouvez donner des ordres n'importe où.

Lorsque vous utilisez la lecture d'un mécanisme de fichier local, l'inconvénient est que vous devez faire vérifier le fichier dans une boucle et utilisera une ressource bit, l'avantage de donner des commandes est très simple (écrivez simplement une chaîne à un Fichier) et vous n'avez pas besoin d'écrire un serveur d'écoute de client et de socket.


0 commentaires

2
votes

L'envoi d'un signal au processus interrompt le processus. Vous trouverez ci-dessous une approche qui utilise un fil dédié pour émuler la console Python. La console est exposée sous la forme d'une prise UNIX.

mmatczuk@cactus:~$ rlwrap nc -U /var/run/test-3196.socket
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import os
>>> os.getpid()
3196
>>> quit()
mmatczuk@cactus:~$ 
  • Fils de vidage, Li>
  • Inspecter la mémoire du processus, LI>
  • attacher le débogueur à la demande, pydev débogueur (travail pour Eclipse et Pycham), LI>
  • Force GC, Li>
  • Définition de la fonction MonkeyPatch sur la mouche li> ul>

    et encore plus. p> p>


3 commentaires

agréable. extraits très utiles pour moi. voté mais besoin d'utiliser dans Python 3


Voici Python 3 version qui devrait fonctionner, je pense: hastebin.com/eketewaxes.py


attributError: le module 'socket' n'a aucun attribut '_fileObject'



0
votes

RPYC est l'outil idéal pour cette tâche. < / p>

En bref, vous définissez un rpyc.service classe qui expose les commandes que vous souhaitez exposer et démarrer un rpyc.server thread.

Votre client se connecte alors à votre processus et appelle les méthodes mappées sur les commandes de votre service expose.

C'est aussi simple et propre que cela. Pas besoin de s'inquiéter des sockets, des signaux, de la sérialisation de l'objet.

Il a d'autres caractéristiques cooles également, par exemple le protocole étant symétrique.


0 commentaires

0
votes

Votre question concerne la communication interprocession. Vous pouvez y parvenir en communiquant sur une prise UNIX ou un port TCP, en utilisant une mémoire partagée ou en utilisant une file d'attente de messagerie ou un système de cache tel que Rabbitmq et Redis.

Ce message Parlez de l'utilisation du MMAP pour atteindre la communication interprocessée de mémoire partagée.

Voici comment commencer avec Redis et rabbitmq , les deux sont plutôt simples à mettre en œuvre.


0 commentaires