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> et chaque fois que je veux mes informations, j'ouvre un nouveau terminal et émettez mon interruption: p> $kill -USR1 <pid>
6 Réponses :
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. p>
Quoi qu'il en soit, si vous l'écrivez à un fichier "sortie.txt" code>, vous pouvez ouvrir bash code> et soit de type dans sortie de la queue.txt Code> Pour les 10 dernières lignes imprimées dans le fichier ou que vous pouvez taper queue -f sortie.txt code>, 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 code>. p>
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
J'avais déjà écrit une application similaire auparavant. P>
Voici ce que j'ai fait: p>
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 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 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ù. P>
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. P> print_info code> dans votre message. P>
prinf_info1 code> print_info2 code> print_info3 code>, vous pouvez donc utiliser un client connecté au port cible et écrire print_info1 em> Pour faire exécuter la commande exécutée print_info1 em> (ou simplement écrire print_info1 em> dans un fichier local si vous utilisez le mécanisme de fichier local de lecture). P>
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:~$
et encore plus. p> p>
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' code>
RPYC code> est l'outil idéal pour cette tâche. < / p>
En bref, vous définissez un Votre client se connecte alors à votre processus et appelle les méthodes mappées sur les commandes de votre service expose. P>
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. P>
Il a d'autres caractéristiques cooles également, par exemple le protocole étant symétrique. P> rpyc.service Code> classe qui expose les commandes que vous souhaitez exposer et démarrer un rpyc.server code> thread. p>
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. p>
Ce message A > Parlez de l'utilisation du MMAP pour atteindre la communication interprocessée de mémoire partagée. P>
Voici comment commencer avec Redis et rabbitmq , les deux sont plutôt simples à mettre en œuvre. P>
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 code> 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 code>, 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.