2016-08-18 1 views
0

Je crée un serveur ZeroMQ au pyzmq en utilisant asyncio. J'essaie de gérer gracieusement l'arrêt du serveur, mais il y a très peu de documentation sur le module asynchrone et il ne semble pas y avoir un moyen simple de gérer l'arrêt du sondage/l'attente en cours. L'arrêt de la boucle dans la méthode .stop ne fait pas grand-chose et ne sortira pas réellement.Gestion de l'interruption du clavier en async zmq

import zmq 
import zmq.asyncio 
import asyncio 

class ZMQHandler(): 
    def __init__(self): 
     self.loop = zmq.asyncio.ZMQEventLoop() 
     asyncio.set_event_loop(self.loop) 
     self.context = zmq.asyncio.Context() 
     self.socket = self.context.socket(zmq.DEALER) 
     self.socket.bind('tcp://127.0.0.1:5000') 
     self.socket.linger = -1 


    def start(self): 
     asyncio.ensure_future(self.listen()) 
     self.loop.run_forever() 

    def stop(self): 
     print('Stopping') 
     self.loop.stop() 

    async def listen(self): 
     self.raw = await self.socket.recv() 
     asyncio.ensure_future(self.listen()) 

Voici quelques exemples de code qui commencerait ceci:

daemon = ZMQHandler() 

def signal_handler(num, frame): 
    daemon.stop() 

signal.signal(signal.SIGTERM, signal_handler) 
signal.signal(signal.SIGINT, signal_handler) 

daemon.start() 

Comment puis-je arrêter avec grâce quand il est en cours d'exécution? Quand j'appelle self.socket.close(), j'obtiens l'erreur zmq.error.ZMQError: Socket operation on non-socket, et si j'appelle self.context.destroy() il se plaint fondamentalement que les douilles n'étaient pas finies proprement avec ETERM.

Répondre

0

Il a fini par être un bug dans la mise en œuvre de pyzmq. Le bug a été corrigé et appelle maintenant loop.stop() fonctionne comme prévu.