diff --git a/oslo/messaging/_drivers/impl_zmq.py b/oslo/messaging/_drivers/impl_zmq.py
index a5b9bba8e..13c0f1942 100644
--- a/oslo/messaging/_drivers/impl_zmq.py
+++ b/oslo/messaging/_drivers/impl_zmq.py
@@ -88,7 +88,6 @@ zmq_opts = [
 
 CONF = cfg.CONF
 
-ZMQ_CTX = None  # ZeroMQ Context, must be global.
 matchmaker = None  # memoized matchmaker object
 
 
@@ -119,7 +118,8 @@ class ZmqSocket(object):
     """
 
     def __init__(self, addr, zmq_type, bind=True, subscribe=None):
-        self.sock = _get_ctxt().socket(zmq_type)
+        self.ctxt = zmq.Context(CONF.rpc_zmq_contexts)
+        self.sock = self.ctxt.socket(zmq_type)
         self.addr = addr
         self.type = zmq_type
         self.subscriptions = []
@@ -196,6 +196,7 @@ class ZmqSocket(object):
         try:
             # Default is to linger
             self.sock.close()
+            self.ctxt.term()
         except Exception:
             # While this is a bad thing to happen,
             # it would be much worse if some of the code calling this
@@ -759,27 +760,6 @@ def _multi_send(method, context, topic, msg, timeout=None,
     return return_val
 
 
-def cleanup():
-    """Clean up resources in use by implementation."""
-    global ZMQ_CTX
-    if ZMQ_CTX:
-        ZMQ_CTX.term()
-    ZMQ_CTX = None
-
-    global matchmaker
-    matchmaker = None
-
-
-def _get_ctxt():
-    if not zmq:
-        raise ImportError("Failed to import eventlet.green.zmq")
-
-    global ZMQ_CTX
-    if not ZMQ_CTX:
-        ZMQ_CTX = zmq.Context(CONF.rpc_zmq_contexts)
-    return ZMQ_CTX
-
-
 def _get_matchmaker(*args, **kwargs):
     global matchmaker
     if not matchmaker:
@@ -858,6 +838,8 @@ class ZmqDriver(base.BaseDriver):
 
     def __init__(self, conf, url, default_exchange=None,
                  allowed_remote_exmods=None):
+        if not zmq:
+            raise ImportError("Failed to import eventlet.green.zmq")
         conf.register_opts(zmq_opts)
         conf.register_opts(impl_eventlet._eventlet_opts)
 
@@ -954,4 +936,4 @@ class ZmqDriver(base.BaseDriver):
         return listener
 
     def cleanup(self):
-        cleanup()
+        pass