def set(self, value: bytes, key=None): """ Sets a key value pare in the remote database. If the key is not set, the function returns a new key. Note that the order of the arguments is reversed from the usual. .. warning:: If the session attribute is specified, all the keys will be prepended with the session id. :param value: Value to be stored :param key: Key for the k-v storage :return: New key or the same key """ if not type(value) == bytes: raise TypeError( 'First argument {} must be of type <bytes>'.format(value)) message = PalmMessage() message.pipeline = str( uuid4()) # For a set job, the pipeline is not important message.client = self.uuid message.stage = 0 message.function = '.'.join([self.server_name, 'set']) message.payload = value if key and self.session_set: message.cache = ''.join([self.pipeline, key]) elif key: message.cache = key self.db.send(message.SerializeToString()) return self.db.recv().decode('utf-8')
def eval(self, function, payload: bytes, messages: int = 1, cache: str = ''): """ Execute single job. :param function: Sting or list of strings following the format ``server.function``. :param payload: Binary message to be sent :param messages: Number of messages expected to be sent back to the client :param cache: Cache data included in the message :return: If messages=1, the result data. If messages > 1, a list with the results """ push_socket = zmq_context.socket(zmq.PUSH) push_socket.connect(self.push_address) sub_socket = zmq_context.socket(zmq.SUB) sub_socket.setsockopt_string(zmq.SUBSCRIBE, self.uuid) sub_socket.connect(self.sub_address) if type(function) == str: # Single-stage job pass elif type(function) == list: # Pipelined job. function = ' '.join(function) message = PalmMessage() message.function = function message.stage = 0 message.pipeline = self.pipeline message.client = self.uuid message.payload = payload if cache: message.cache = cache push_socket.send(message.SerializeToString()) result = [] for i in range(messages): [client, message_data] = sub_socket.recv_multipart() message.ParseFromString(message_data) result.append(message.payload) if messages == 1: return result[0] else: return result
def _sender(self, socket, function, generator, cache): for payload in generator: message = PalmMessage() message.function = function message.stage = 0 message.pipeline = self.pipeline message.client = self.uuid message.payload = payload if cache: message.cache = cache socket.send(message.SerializeToString())
def fake_router(): original_message = PalmMessage() original_message.pipeline = 'pipeline' original_message.client = 'client' original_message.stage = 1 original_message.cache = '0' original_message.function = 'function' original_message.payload = b'0' socket = zmq_context.socket(zmq.REQ) socket.bind(broker_address) serialized = original_message.SerializeToString() socket.send(serialized) socket.recv()
def set(self, value, key=None): """ Sets a key value pare in the remote database. :param key: :param value: :return: """ message = PalmMessage() message.pipeline = str(uuid4()) message.client = self.uuid message.stage = 0 message.function = '.'.join(['_', 'set']) message.payload = value if key: message.cache = key self.db.send(message.SerializeToString()) return self.db.recv().decode('utf-8')