f3ea04c568
Change-Id: I2aa5f9a2ce51f3f0c5422d94eb28d2f37e3af458
103 lines
3.0 KiB
Python
103 lines
3.0 KiB
Python
# Copyright 2015 Mirantis, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import abc
|
|
|
|
import six
|
|
|
|
|
|
@six.add_metaclass(abc.ABCMeta)
|
|
class ZmqPoller(object):
|
|
|
|
"""Base poller interface
|
|
|
|
Needed to poll on zmq sockets in green and native async manner.
|
|
Native poller implementation wraps zmq.Poller helper class.
|
|
Wrapping is needed to provide unified poller interface
|
|
in zmq-driver (for both native and zmq pollers). It makes some
|
|
difference with poller-helper from zmq library which doesn't actually
|
|
receive message.
|
|
|
|
The poller object should be obtained over:
|
|
|
|
poller = zmq_async.get_poller()
|
|
|
|
Then we have to register sockets for polling. We are able
|
|
to provide specific receiving method. By default poller calls
|
|
socket.recv_multipart.
|
|
|
|
def receive_message(socket):
|
|
id = socket.recv_string()
|
|
ctxt = socket.recv_json()
|
|
msg = socket.recv_json()
|
|
return (id, ctxt, msg)
|
|
|
|
poller.register(socket, recv_method=receive_message)
|
|
|
|
Further to receive a message we should call:
|
|
|
|
message, socket = poller.poll()
|
|
|
|
The 'message' here contains (id, ctxt, msg) tuple.
|
|
"""
|
|
|
|
@abc.abstractmethod
|
|
def register(self, socket, recv_method=None):
|
|
"""Register socket to poll
|
|
|
|
:param socket: Socket to subscribe for polling
|
|
:type socket: ZmqSocket
|
|
:param recv_method: Optional specific receiver procedure
|
|
Should return received message object
|
|
:type recv_method: callable
|
|
"""
|
|
@abc.abstractmethod
|
|
def unregister(self, socket):
|
|
"""Unregister socket from poll
|
|
|
|
:param socket: Socket to unsubscribe from polling
|
|
:type socket: ZmqSocket
|
|
"""
|
|
|
|
@abc.abstractmethod
|
|
def poll(self, timeout=None):
|
|
"""Poll for messages
|
|
|
|
:param timeout: Optional polling timeout
|
|
None or -1 means poll forever
|
|
any positive value means timeout in seconds
|
|
:type timeout: int
|
|
:returns: (message, socket) tuple
|
|
"""
|
|
|
|
@abc.abstractmethod
|
|
def close(self):
|
|
"""Terminate polling"""
|
|
|
|
|
|
@six.add_metaclass(abc.ABCMeta)
|
|
class Executor(object):
|
|
"""Base executor interface for threading/green async executors"""
|
|
|
|
def __init__(self, thread):
|
|
self.thread = thread
|
|
|
|
@abc.abstractmethod
|
|
def execute(self):
|
|
"""Run execution"""
|
|
|
|
@abc.abstractmethod
|
|
def stop(self):
|
|
"""Stop execution"""
|