def run(child_gr, *args, **kwargs): try: result = func(*args, **kwargs) except: exc_info = sys.exc_info() result = Future() result.set_exc_info(exc_info) if not is_future(result): return child_gr.switch(result) return ioloop.add_future(result, child_gr.switch)
class Work(object): def __init__(self, target, args): self.target = target self.args = args self.future = Future() def execute(self): try: out = self.target(*self.args) self.future.set_result(out) except Exception: self.future.set_exc_info(sys.exc_info())
class GreenTask(greenlet.greenlet): def __init__(self, run, *args, **kwargs): super(GreenTask, self).__init__() self._run = run self._args = args self._kwargs = kwargs self._future = Future() self._result = None self._exc_info = () @property def args(self): return self._args @property def kwargs(self): return self._kwargs def run(self): try: timeout = self.kwargs.pop("timeout", 0) if timeout: timer = Timeout(timeout) timer.start() self._result = self._run(*self.args, **self.kwargs) self._future.set_result(self._result) except: self._exc_info = sys.exc_info() self._future.set_exc_info(self._exc_info) finally: if timeout: timer.cancel() def start(self): self.switch() def __str__(self): func_name = "%s of %s " % (self._run.__name__, self._run.__module__) return "<greenlet %s at %s>" % (func_name, hex(id(self))) def __repr__(self): return self.__str__() def wait(self): return self._future @classmethod def spawn(cls_green, *args, **kwargs): task = cls_green(*args, **kwargs) task.start() return task
def connect(self): """ Initiate asynchronous connect. Returns future that resolves to this connection object. """ begin_t = datetime.datetime.now() kwargs = {"async": True} if self.connection_factory: kwargs["connection_factory"] = self.connection_factory if self.cursor_factory: kwargs["cursor_factory"] = self.cursor_factory future = Future() self.connection = None try: self.connection = psycopg2.connect(self.dsn, **kwargs) except (psycopg2.Error, psycopg2.OperationalError) as error: self.connection = None future.set_exc_info(sys.exc_info()) return future self.fileno = self.connection.fileno() def log_callback(): if self.connection_need_log: vals = {'conn': self.fileno, 'cost': (datetime.datetime.now() - begin_t)} perf_log.debug('connection({conn})\tconnect_cost({cost})'.format(**vals)) if self.setsession: on_connect_future = Future() def on_connect(on_connect_future): self.ioloop.add_future(self.transaction(self.setsession), lambda x: future.set_result(self)) self.ioloop.add_future(on_connect_future, on_connect) callback = partial(self._io_callback, on_connect_future, self, log_callback=log_callback) else: callback = partial(self._io_callback, future, self, log_callback=log_callback) self.ioloop.add_handler(self.fileno, callback, IOLoop.WRITE) self.ioloop.add_future(future, self._set_server_version) self.ioloop.add_future(future, self._close_on_fail) return future
def connect(self): """ Initiate asynchronous connect. Returns future that resolves to this connection object. """ kwargs = {"async": True} if self.connection_factory: kwargs["connection_factory"] = self.connection_factory if self.cursor_factory: kwargs["cursor_factory"] = self.cursor_factory future = Future() self.connection = None try: self.connection = psycopg2.connect(self.dsn, **kwargs) except psycopg2.Error: self.connection = None future.set_exc_info(sys.exc_info()) return future self.fileno = self.connection.fileno() if self.setsession: on_connect_future = Future() def on_connect(on_connect_future): self.ioloop.add_future(self.transaction(self.setsession), lambda x: future.set_result(self)) self.ioloop.add_future(on_connect_future, on_connect) callback = partial(self._io_callback, on_connect_future, self) else: callback = partial(self._io_callback, future, self) self.ioloop.add_handler(self.fileno, callback, IOLoop.WRITE) self.ioloop.add_future(future, self._set_server_version) self.ioloop.add_future(future, self._close_on_fail) return future