Source code for obci.control.launcher.remote_process

#!/usr/bin/python
# -*- coding: utf-8 -*-

import zmq

from obci.control.common.message import OBCIMessageTool, PollingObject, send_msg
from obci.control.launcher.launcher_messages import message_templates

from . import process
from .process import FAILED, TERMINATED, PING, RETURNCODE, REG_TIMER


[docs]class RemoteProcess(process.Process): def __init__(self, proc_description, rq_address, reg_timeout_desc=None, monitoring_optflags=PING, logger=None): self.rq_address = rq_address self._ctx = None # returncode monitoring is not supported in remote processes.. monitoring_optflags = monitoring_optflags & ~(1 << RETURNCODE) super(RemoteProcess, self).__init__(proc_description, reg_timeout_desc, monitoring_optflags, logger)
[docs] def is_local(self): return False
def _do_handle_timeout(self, type_): if type_ == REG_TIMER: self._status = FAILED self._status_details = "Failed to register before timeout."
[docs] def registered(self, reg_data): super(RemoteProcess, self).registered(reg_data) self.desc.pid = reg_data.pid
[docs] def returncode_monitor(self): pass
[docs] def kill(self): # send "kill" to the process or kill request to its supervisor? self.stop_monitoring() if not self._ctx: self._ctx = zmq.Context() rq_sock = self._ctx.socket(zmq.REQ) try: rq_sock.connect(self.rq_address) mtool = OBCIMessageTool(message_templates) poller = PollingObject() send_msg(rq_sock, mtool.fill_msg("kill_process", pid=self.pid, machine=self.machine_ip)) res, _ = poller.poll_recv(rq_sock, timeout=5000) finally: rq_sock.close() if res: res = mtool.unpack_msg(res) print("Response to kill request: ", res) with self._status_lock: self._status = TERMINATED