Search code examples
pythontwistedzeromq

How to wrap a zeromq bind socket in a twisted application service?


I am using txzmq and twisted to build a listener service that will process some data through a push-pull pattern. Here's a working code:

from txzmq import ZmqFactory, ZmqEndpoint, ZmqPullConnection
from twisted.internet import reactor

zf = ZmqFactory()
endpoint = ZmqEndpoint('bind', 'tcp://*:5050')

def onPull(data):
    # do something with data

puller = ZmqPullConnection(zf, endpoint)
puller.onPull = onPull

reactor.run()

My question is - how can I wrap this code in a twisted application service? That is, how to wrap this into a specific service (e.g. MyService) that I can later run with:

from twisted.application.service import Application

application = Application('My listener')
service = MyService(bind_address='*', port=5050)
service.setServiceParent(application)

with the twistd runner?


Solution

  • IService defines what it means to be a service. Service is a base class that is often helpful when implementing a new service.

    Just move your ZMQ initialization code into a startService method of an object that implements IService, perhaps a subclass of Service. If you want to do proper cleanup too, then add some cleanup code to the stopService method of that class.