"""
ZeroMQ Twisted factory which is controlling ZeroMQ context.
"""
from zmq import Context
from twisted.internet import reactor
[docs]class ZmqFactory(object):
"""
I control individual ZeroMQ connections.
Factory creates and destroys ZeroMQ context.
:var reactor: reference to Twisted reactor used by all the connections
:var ioThreads: number of IO threads ZeroMQ will be using for this context
:vartype ioThreads: int
:var lingerPeriod: number of milliseconds to block when closing socket
(terminating context), when there are some messages pending to be sent
:vartype lingerPeriod: int
:var connections: set of instanciated :class:`ZmqConnection`
:vartype connections: set
:var context: ZeroMQ context
"""
reactor = reactor
ioThreads = 1
lingerPeriod = 100
trigger = None
[docs] def __init__(self):
"""
Constructor.
Create ZeroMQ context.
"""
self.connections = set()
self.context = Context(self.ioThreads)
def __repr__(self):
return "ZmqFactory()"
[docs] def shutdown(self):
"""
Shutdown factory.
This is shutting down all created connections
and terminating ZeroMQ context. Also cleans up
Twisted reactor.
"""
for connection in self.connections.copy():
connection.shutdown()
self.connections = None
self.context.term()
self.context = None
if self.trigger:
try:
self.reactor.removeSystemEventTrigger(self.trigger)
except Exception:
pass # just ignore while triggered by the reactor
[docs] def registerForShutdown(self):
"""
Register factory to be automatically shut down
on reactor shutdown.
It is recommended that this method is called on any
created factory.
"""
self.trigger = self.reactor.addSystemEventTrigger(
'during', 'shutdown', self.shutdown
)