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
.