2017-03-29 1 views
0

J'ai un serveur derrière un pare-feu et un serveur web publiquement disponible demandant des informations du serveur. J'utilise pyzmq pour gérer la communication entre le backend et le web frontal. Ce travail sans proxy en place, quand ils communiquent localement. Cela fonctionne en utilisant le proxy. Je peux démarrer un ThreadProxy, mais comment l'arrêter?Dans pyzmq, comment arrêtez-vous un proxy?

import zmq 
from zmq.devices import ThreadProxy 

class MyProxy: 
    def __init__(self) 
     p = ThreadProxy(zmq.ROUTER, zmq.DEALER) # Not using mon 
     p.setsockopt_in(zmq.IDENTITY, b'ROUTER') 
     p.setsockopt_out(zmq.IDENTITY, b'DEALER') 
     p.bind_in('tcp://*:5550') 
     p.connect_out('tcp://localhost:5550') 
     self._proxy = p 
    def start(self) 
     self._proxy.start() 
    def stop(self) 
     ??? 

Comment puis-je demander à ce proxy d'arrêter? .join attend juste, car le proxy est bloqué ou n'a aucune raison d'arrêter. Je n'ai pas de contexte pour .term(). Je voudrais lancer ceci à l'intérieur d'un démon linux, donc "kill" n'est pas la solution la plus élégante, et ne me donne pas non plus le contrôle sur le proxy que je cherche.

Répondre

1

La réponse est que le proxy se ferme.

Je pense que mon problème était de comprendre. Le proxy est démarré en tant que démon (la valeur par défaut) et je ne savais pas ce que cela signifiait pour Python. Lorsque tous les threads non-daemon ont terminé, le programme se termine. Ce que cela signifie dans ce contexte est que le proxy s'arrête quand le reste de mon programme s'arrête. Je n'ai pas besoin de l'arrêter explicitement. Comme je construis un service Linux, c'est exactement la fonctionnalité que je veux. Dans le thread principal, je vais lancer le proxy, faire quelque chose (comme surveiller le proxy) ou rien, et quand je veux arrêter le service, le thread principal se terminera, se fermera et le proxy mourra seul.

+0

En supposant que le proxy se comporte de la même manière qu'un périphérique normal, il meurt lorsque le contexte se ferme. Faire quelque chose comme 'myProxy.context_factory(). Term()' finira par arrêter le proxy manuellement, bien que laisser la garbage collection le faire pour vous fonctionne bien aussi. – FirefoxMetzger