def screenshot( task, url, width=settings.BASE_WEBPAGE_PREVIEW_WIDTH, height=settings.BASE_WEBPAGE_PREVIEW_HEIGHT, lifetime=settings.BASE_WEBPAGE_PREVIEW_LIFETIME, ): url_id = sha256() url_id.update(url.encode("utf-8")) url_id.update(bytes(width)) url_id.update(bytes(height)) key = url_id.hexdigest() logger.info(f"Screenshot for {url} @ {width}x{height}: {key}") if key in cache: logger.info(f"Found {key} in cache.") return key logger.info(f"Locking {key}") lock = cache.lock(key) lock.acquire() logger.info("Starting WebEngineScreenshot app") parent_conn, child_conn = Pipe() p = Process(target=WebpageTasks.worker, args=(url, width, height, child_conn)) p.start() image = parent_conn.recv() p.join() if not image: logger.info("WebEngineScreenshot app returned nothing") return None logger.info("Writing WebEngineScreenshot app result to cache") cache.set(key, image, timeout=lifetime) logger.info("Removing WebEngineScreenshot app singleton") return key
def _fork_and_submit_job(self, job): parent_pipe, child_pipe = Pipe() try: p = Process(target=self._submit_job_to_lsf, args=(child_pipe, parent_pipe, job,)) p.start() except: parent_pipe.close() raise finally: child_pipe.close() try: p.join() result = parent_pipe.recv() if isinstance(result, basestring): raise SubmitError(result) except EOFError: raise SubmitError('Unknown exception submitting job') finally: parent_pipe.close() return result
class MEState(object): '''holds state of MAVExplorer''' def __init__(self): self.input_queue = queue.Queue() self.rl = None self.console = wxconsole.MessageConsole(title='MAVExplorer') self.exit = False self.status = MEStatus() self.settings = MPSettings([ MPSetting('marker', str, '+', 'data marker', tab='Graph'), MPSetting('condition', str, None, 'condition'), MPSetting('xaxis', str, None, 'xaxis'), MPSetting('linestyle', str, None, 'linestyle'), MPSetting('show_flightmode', bool, True, 'show flightmode'), MPSetting('legend', str, 'upper left', 'legend position'), MPSetting('legend2', str, 'upper right', 'legend2 position') ]) self.mlog = None self.command_map = command_map self.completions = { "set": ["(SETTING)"], "condition": ["(VARIABLE)"], "graph": [ '(VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE)' ], "map": ['(VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE)'] } self.aliases = {} self.graphs = [] self.flightmode_selections = [] self.last_graph = GraphDefinition('Untitled', '', '', [], None) #pipe to the wxconsole for any child threads (such as the save dialog box) self.parent_pipe_recv_console, self.child_pipe_send_console = Pipe( duplex=False) #pipe for creating graphs (such as from the save dialog box) self.parent_pipe_recv_graph, self.child_pipe_send_graph = Pipe( duplex=False) tConsoleWrite = threading.Thread(target=self.pipeRecvConsole) tConsoleWrite.daemon = True tConsoleWrite.start() tGraphWrite = threading.Thread(target=self.pipeRecvGraph) tGraphWrite.daemon = True tGraphWrite.start() def pipeRecvConsole(self): '''watch for piped data from save dialog''' try: while True: console_msg = self.parent_pipe_recv_console.recv() if console_msg is not None: self.console.writeln(console_msg) time.sleep(0.1) except EOFError: pass def pipeRecvGraph(self): '''watch for piped data from save dialog''' try: while True: graph_rec = self.parent_pipe_recv_graph.recv() if graph_rec is not None: mestate.input_queue.put(graph_rec) time.sleep(0.1) except EOFError: pass
class MEState(object): '''holds state of MAVExplorer''' def __init__(self): self.input_queue = Queue.Queue() self.rl = None self.console = wxconsole.MessageConsole(title='MAVExplorer') self.exit = False self.status = MEStatus() self.settings = MPSettings( [ MPSetting('marker', str, '+', 'data marker', tab='Graph'), MPSetting('condition', str, None, 'condition'), MPSetting('xaxis', str, None, 'xaxis'), MPSetting('linestyle', str, None, 'linestyle'), MPSetting('show_flightmode', bool, True, 'show flightmode'), MPSetting('legend', str, 'upper left', 'legend position'), MPSetting('legend2', str, 'upper right', 'legend2 position') ] ) self.mlog = None self.command_map = command_map self.completions = { "set" : ["(SETTING)"], "condition" : ["(VARIABLE)"], "graph" : ['(VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE)'], "map" : ['(VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE) (VARIABLE)'] } self.aliases = {} self.graphs = [] self.flightmode_selections = [] self.last_graph = GraphDefinition('Untitled', '', '', [], None) #pipe to the wxconsole for any child threads (such as the save dialog box) self.parent_pipe_recv_console,self.child_pipe_send_console = Pipe(duplex=False) #pipe for creating graphs (such as from the save dialog box) self.parent_pipe_recv_graph,self.child_pipe_send_graph = Pipe(duplex=False) tConsoleWrite = threading.Thread(target=self.pipeRecvConsole) tConsoleWrite.daemon = True tConsoleWrite.start() tGraphWrite = threading.Thread(target=self.pipeRecvGraph) tGraphWrite.daemon = True tGraphWrite.start() def pipeRecvConsole(self): '''watch for piped data from save dialog''' try: while True: console_msg = self.parent_pipe_recv_console.recv() if console_msg is not None: self.console.writeln(console_msg) time.sleep(0.1) except EOFError: pass def pipeRecvGraph(self): '''watch for piped data from save dialog''' try: while True: graph_rec = self.parent_pipe_recv_graph.recv() if graph_rec is not None: mestate.input_queue.put(graph_rec) time.sleep(0.1) except EOFError: pass
class MessageConsole(textconsole.SimpleConsole): ''' a message console for MAVProxy ''' def __init__(self, title='MAVProxy: console'): if platform.system() == 'Darwin': forking_enable(False) textconsole.SimpleConsole.__init__(self) self.title = title self.menu_callback = None self.parent_pipe_recv, self.child_pipe_send = Pipe(duplex=False) self.child_pipe_recv, self.parent_pipe_send = Pipe(duplex=False) self.close_event = Event() self.close_event.clear() self.child = Process(target=self.child_task) self.child.start() self.child_pipe_send.close() self.child_pipe_recv.close() t = threading.Thread(target=self.watch_thread) t.daemon = True t.start() def child_task(self): '''child process - this holds all the GUI elements''' self.parent_pipe_send.close() self.parent_pipe_recv.close() import wx_processguard from wx_loader import wx from wxconsole_ui import ConsoleFrame app = wx.App(False) app.frame = ConsoleFrame(state=self, title=self.title) app.frame.SetDoubleBuffered(True) app.frame.Show() app.MainLoop() def watch_thread(self): '''watch for menu events from child''' from mp_settings import MPSetting try: while True: msg = self.parent_pipe_recv.recv() if self.menu_callback is not None: self.menu_callback(msg) time.sleep(0.1) except EOFError: pass def write(self, text, fg='black', bg='white'): '''write to the console''' try: self.parent_pipe_send.send(Text(text, fg, bg)) except Exception: pass def set_status(self, name, text='', row=0, fg='black', bg='white'): '''set a status value''' if self.is_alive(): self.parent_pipe_send.send(Value(name, text, row, fg, bg)) def set_menu(self, menu, callback): if self.is_alive(): self.parent_pipe_send.send(menu) self.menu_callback = callback def close(self): '''close the console''' self.close_event.set() if self.is_alive(): self.child.join(2) def is_alive(self): '''check if child is still going''' return self.child.is_alive()