class Async_Optimize(object):
    def __init__(self):
        self.callback = lambda *x: None
        self.runsignal = Event()
        self.SENTINEL = "SENTINEL"

    def async_callback_collect(self, q):
        while self.runsignal.is_set():
            try:
                for ret in iter(lambda: q.get(timeout=1), self.SENTINEL):
                    self.callback(*ret)
                self.runsignal.clear()
            except Empty:
                pass

    def opt_async(self, f, df, x0, callback, update_rule=PolakRibiere,
                   messages=0, maxiter=5e3, max_f_eval=15e3, gtol=1e-6,
                   report_every=10, *args, **kwargs):
        self.runsignal.set()
        c = None
        outqueue = None
        if callback:
            outqueue = Queue()
            self.callback = callback
            c = Thread(target=self.async_callback_collect, args=(outqueue,))
            c.start()
        p = _CGDAsync(f, df, x0, update_rule, self.runsignal, self.SENTINEL,
                 report_every=report_every, messages=messages, maxiter=maxiter,
                 max_f_eval=max_f_eval, gtol=gtol, outqueue=outqueue, *args, **kwargs)
        p.start()
        return p, c

    def opt(self, f, df, x0, callback=None, update_rule=FletcherReeves,
                   messages=0, maxiter=5e3, max_f_eval=15e3, gtol=1e-6,
                   report_every=10, *args, **kwargs):
        p, c = self.opt_async(f, df, x0, callback, update_rule, messages,
                            maxiter, max_f_eval, gtol,
                            report_every, *args, **kwargs)
        while self.runsignal.is_set():
            try:
                p.join(1)
                if c: c.join(1)
            except KeyboardInterrupt:
                # print "^C"
                self.runsignal.clear()
                p.join()
                if c: c.join()
        if c and c.is_alive():
#             self.runsignal.set()
#             while self.runsignal.is_set():
#                 try:
#                     c.join(.1)
#                 except KeyboardInterrupt:
#                     # print "^C"
#                     self.runsignal.clear()
#                     c.join()
            print("WARNING: callback still running, optimisation done!")
        return p.result
Пример #2
0
async def check_multiprocess_shutdown_event(
    shutdown_event: EventType, sleep: Callable[[float], Awaitable[Any]]
) -> None:
    while True:
        if shutdown_event.is_set():
            return
        await sleep(0.1)
Пример #3
0
async def check_shutdown(
    shutdown_event: EventType, sleep: Callable[[float], Awaitable[Any]]
) -> None:
    while True:
        if shutdown_event.is_set():
            raise Shutdown()
        await sleep(0.1)
Пример #4
0
class Generator():
    
    def __init__(self, configurationPath, outputQueue):
        self.processorQueue = outputQueue
        self.logger = logging.getLogger("generator")
        self.lirchandle = pylirc.init("pylirc", configurationPath, False)
        self.stopFlag = Event()

    def loop(self):
        self.logger.info("Starting up.")
        if(self.lirchandle):
            inputLirc = [self.lirchandle]
            timeout = 2
            self.logger.info("Succesfully opened lirc, handle is " + str(self.lirchandle))
            self.logger.info("Started.")
            while (not self.stopFlag.is_set()):
                inputready, outputready, exceptready = select.select(inputLirc,[],[], timeout)
                s = pylirc.nextcode(1)                    
                if(s):
                    for code in s:                        
                        repeat = code["repeat"]
                        currentCommand = code["config"]
                        self.logger.info("New event received: id: = %s, repeat = %s" % (currentCommand, repeat))
                        try:                            
                            self.processorQueue.put_nowait(GeneratorEvent(currentCommand, repeat))
                        except Queue.Full:
                            self.logger.error("Processor queue is overloaded.")                    
            self.logger.info("Shutted down.")

    def shutdown(self):
        self.logger.debug("Shutting down.")        
        self.stopFlag.set()
        pylirc.exit()        
Пример #5
0
    async def wslogs(self,
                     remote_id: 'str',
                     stop_event: Event,
                     current_line: int = 0):
        """ websocket log stream from remote pea/pod

        :param remote_id: the identity of that pea/pod
        :param stop_event: the multiprocessing event which marks if stop event is set
        :param current_line: the line number from which logs would be streamed
        :return:
        """
        with ImportExtensions(required=True):
            import websockets

        try:
            # sleeping for few seconds to allow the logs to be written in remote
            await asyncio.sleep(3)
            async with websockets.connect(
                    f'{self.log_url}/{remote_id}?timeout=20') as websocket:
                await websocket.send(json.dumps({'from': current_line}))
                remote_loggers = {}
                while True:
                    log_line = await websocket.recv()
                    if log_line:
                        try:
                            log_line = json.loads(log_line)
                            current_line = int(list(log_line.keys())[0])
                            log_line_dict = list(log_line.values())[0]
                            log_line_dict = json.loads(
                                log_line_dict.split('\t')[-1].strip())
                            name = log_line_dict['name']
                            if name not in remote_loggers:
                                remote_loggers[name] = JinaLogger(
                                    context=f'🌏 {name}')
                            # TODO: change logging level, process name in local logger
                            remote_loggers[name].info(
                                f'{log_line_dict["message"].strip()}')
                        except json.decoder.JSONDecodeError:
                            continue
                    await websocket.send(json.dumps({}))
                    if stop_event.is_set():
                        for logger in remote_loggers.values():
                            logger.close()
                        raise RemotePodClosed
        except websockets.exceptions.ConnectionClosedOK:
            self.logger.debug(f'Client got disconnected from server')
            return current_line
        except websockets.exceptions.WebSocketException as e:
            self.logger.error(
                f'Got following error while streaming logs via websocket {repr(e)}'
            )
            return 0
Пример #6
0
def _worker(queue: JoinableQueue, engine: Engine,
            discovery: Dict[str, DiscoveryState], objects: List[Artifact],
            lock: LockT, stopswitch: EventT):
    while not stopswitch.is_set():
        try:
            artifact = queue.get(block=True, timeout=0.5)
        except QueueEmpty:
            continue

        try:
            new_artifacts = engine.process(artifact, discovery, objects, lock)

            for new_artifact in new_artifacts:
                queue.put(new_artifact)
        finally:
            queue.task_done()
Пример #7
0
    def log(self, remote_id: 'str', stop_event: Event, **kwargs) -> None:
        """ Start the log stream from remote pea/pod, will use local logger for output

        :param remote_id: the identity of that pea/pod
        :return:
        """

        with ImportExtensions(required=True):
            import requests

        try:
            url = f'{self.log_url}/?{self.kind}_id={remote_id}'
            r = requests.get(url=url, stream=True)
            for log_line in r.iter_content():
                if log_line:
                    self.logger.info(f'🌏 {log_line.strip()}')
                if stop_event.is_set():
                    break
        except requests.exceptions.RequestException as ex:
            self.logger.error(
                f'couldn\'t connect with remote jinad url {repr(ex)}')
        finally:
            self.logger.info(f'🌏 exiting from remote logger')
Пример #8
0
class Async_Optimize(object):
    def __init__(self):
        self.callback = lambda *x: None
        self.runsignal = Event()
        self.SENTINEL = "SENTINEL"

    def async_callback_collect(self, q):
        while self.runsignal.is_set():
            try:
                for ret in iter(lambda: q.get(timeout=1), self.SENTINEL):
                    self.callback(*ret)
                self.runsignal.clear()
            except Empty:
                pass

    def opt_async(self,
                  f,
                  df,
                  x0,
                  callback,
                  update_rule=PolakRibiere,
                  messages=0,
                  maxiter=5e3,
                  max_f_eval=15e3,
                  gtol=1e-6,
                  report_every=10,
                  *args,
                  **kwargs):
        self.runsignal.set()
        c = None
        outqueue = None
        if callback:
            outqueue = Queue()
            self.callback = callback
            c = Thread(target=self.async_callback_collect, args=(outqueue, ))
            c.start()
        p = _CGDAsync(f,
                      df,
                      x0,
                      update_rule,
                      self.runsignal,
                      self.SENTINEL,
                      report_every=report_every,
                      messages=messages,
                      maxiter=maxiter,
                      max_f_eval=max_f_eval,
                      gtol=gtol,
                      outqueue=outqueue,
                      *args,
                      **kwargs)
        p.start()
        return p, c

    def opt(self,
            f,
            df,
            x0,
            callback=None,
            update_rule=FletcherReeves,
            messages=0,
            maxiter=5e3,
            max_f_eval=15e3,
            gtol=1e-6,
            report_every=10,
            *args,
            **kwargs):
        p, c = self.opt_async(f, df, x0, callback, update_rule, messages,
                              maxiter, max_f_eval, gtol, report_every, *args,
                              **kwargs)
        while self.runsignal.is_set():
            try:
                p.join(1)
                if c: c.join(1)
            except KeyboardInterrupt:
                # print "^C"
                self.runsignal.clear()
                p.join()
                if c: c.join()
        if c and c.is_alive():
            #             self.runsignal.set()
            #             while self.runsignal.is_set():
            #                 try:
            #                     c.join(.1)
            #                 except KeyboardInterrupt:
            #                     # print "^C"
            #                     self.runsignal.clear()
            #                     c.join()
            print("WARNING: callback still running, optimisation done!")
        return p.result