Python types.coroutine() Examples
The following are 30
code examples of types.coroutine().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
types
, or try the search function
.
Example #1
Source File: test_coroutines.py From Fluid-Designer with GNU General Public License v3.0 | 6 votes |
def test_func_4(self): async def foo(): raise StopIteration check = lambda: self.assertRaisesRegex( TypeError, "'coroutine' object is not iterable") with check(): list(foo()) with check(): tuple(foo()) with check(): sum(foo()) with check(): iter(foo()) with silence_coro_gc(), check(): for i in foo(): pass with silence_coro_gc(), check(): [i for i in foo()]
Example #2
Source File: gen.py From tornado-zh with MIT License | 6 votes |
def sleep(duration): """Return a `.Future` that resolves after the given number of seconds. When used with ``yield`` in a coroutine, this is a non-blocking analogue to `time.sleep` (which should not be used in coroutines because it is blocking):: yield gen.sleep(0.5) Note that calling this function on its own does nothing; you must wait on the `.Future` it returns (usually by yielding it). .. versionadded:: 4.1 """ f = Future() IOLoop.current().call_later(duration, lambda: f.set_result(None)) return f
Example #3
Source File: gen.py From tornado-zh with MIT License | 6 votes |
def _argument_adapter(callback): """Returns a function that when invoked runs ``callback`` with one arg. If the function returned by this function is called with exactly one argument, that argument is passed to ``callback``. Otherwise the args tuple and kwargs dict are wrapped in an `Arguments` object. """ def wrapper(*args, **kwargs): if kwargs or len(args) > 1: callback(Arguments(args, kwargs)) elif args: callback(args[0]) else: callback(None) return wrapper # Convert Awaitables into Futures. It is unfortunately possible # to have infinite recursion here if those Awaitables assume that # we're using a different coroutine runner and yield objects # we don't understand. If that happens, the solution is to # register that runner's yieldable objects with convert_yielded.
Example #4
Source File: tasks.py From Imogen with MIT License | 6 votes |
def run_coroutine_threadsafe(coro, loop): """Submit a coroutine object to a given event loop. Return a concurrent.futures.Future to access the result. """ if not coroutines.iscoroutine(coro): raise TypeError('A coroutine object is required') future = concurrent.futures.Future() def callback(): try: futures._chain_future(ensure_future(coro, loop=loop), future) except Exception as exc: if future.set_running_or_notify_cancel(): future.set_exception(exc) raise loop.call_soon_threadsafe(callback) return future # WeakSet containing all alive tasks.
Example #5
Source File: test_coroutines.py From Fluid-Designer with GNU General Public License v3.0 | 6 votes |
def test_set_wrapper_4(self): @types.coroutine def foo(): return 'spam' wrapped = None def wrap(gen): nonlocal wrapped wrapped = gen return gen sys.set_coroutine_wrapper(wrap) try: foo() self.assertIs( wrapped, None, "generator-based coroutine was wrapped via " "sys.set_coroutine_wrapper") finally: sys.set_coroutine_wrapper(None)
Example #6
Source File: tasks.py From Imogen with MIT License | 6 votes |
def ensure_future(coro_or_future, *, loop=None): """Wrap a coroutine or an awaitable in a future. If the argument is a Future, it is returned directly. """ if coroutines.iscoroutine(coro_or_future): if loop is None: loop = events.get_event_loop() task = loop.create_task(coro_or_future) if task._source_traceback: del task._source_traceback[-1] return task elif futures.isfuture(coro_or_future): if loop is not None and loop is not futures._get_loop(coro_or_future): raise ValueError('loop argument must agree with Future') return coro_or_future elif inspect.isawaitable(coro_or_future): return ensure_future(_wrap_awaitable(coro_or_future), loop=loop) else: raise TypeError('An asyncio.Future, a coroutine or an awaitable is ' 'required')
Example #7
Source File: test_types.py From Fluid-Designer with GNU General Public License v3.0 | 6 votes |
def test_non_gen_values(self): @types.coroutine def foo(): return 'spam' self.assertEqual(foo(), 'spam') class Awaitable: def __await__(self): return () aw = Awaitable() @types.coroutine def foo(): return aw self.assertIs(aw, foo()) # decorate foo second time foo = types.coroutine(foo) self.assertIs(aw, foo())
Example #8
Source File: gen.py From tornado-zh with MIT License | 6 votes |
def _argument_adapter(callback): """Returns a function that when invoked runs ``callback`` with one arg. If the function returned by this function is called with exactly one argument, that argument is passed to ``callback``. Otherwise the args tuple and kwargs dict are wrapped in an `Arguments` object. """ def wrapper(*args, **kwargs): if kwargs or len(args) > 1: callback(Arguments(args, kwargs)) elif args: callback(args[0]) else: callback(None) return wrapper # Convert Awaitables into Futures. It is unfortunately possible # to have infinite recursion here if those Awaitables assume that # we're using a different coroutine runner and yield objects # we don't understand. If that happens, the solution is to # register that runner's yieldable objects with convert_yielded.
Example #9
Source File: tasks.py From Imogen with MIT License | 6 votes |
def _cancel_and_wait(fut, loop): """Cancel the *fut* future or task and wait until it completes.""" waiter = loop.create_future() cb = functools.partial(_release_waiter, waiter) fut.add_done_callback(cb) try: fut.cancel() # We cannot wait on *fut* directly to make # sure _cancel_and_wait itself is reliably cancellable. await waiter finally: fut.remove_done_callback(cb) # This is *not* a @coroutine! It is just an iterator (yielding Futures).
Example #10
Source File: gen.py From tornado-zh with MIT License | 6 votes |
def __init__(self, gen, result_future, first_yielded): self.gen = gen self.result_future = result_future self.future = _null_future self.yield_point = None self.pending_callbacks = None self.results = None self.running = False self.finished = False self.had_exception = False self.io_loop = IOLoop.current() # For efficiency, we do not create a stack context until we # reach a YieldPoint (stack contexts are required for the historical # semantics of YieldPoints, but not for Futures). When we have # done so, this field will be set and must be called at the end # of the coroutine. self.stack_context_deactivate = None if self.handle_yield(first_yielded): self.run()
Example #11
Source File: test_coroutines.py From Fluid-Designer with GNU General Public License v3.0 | 6 votes |
def test_set_wrapper_3(self): async def foo(): return 'spam' def wrapper(coro): async def wrap(coro): return await coro return wrap(coro) sys.set_coroutine_wrapper(wrapper) try: with silence_coro_gc(), self.assertRaisesRegex( RuntimeError, "coroutine wrapper.*\.wrapper at 0x.*attempted to " "recursively wrap .* wrap .*"): foo() finally: sys.set_coroutine_wrapper(None)
Example #12
Source File: tasks.py From Imogen with MIT License | 6 votes |
def get_stack(self, *, limit=None): """Return the list of stack frames for this task's coroutine. If the coroutine is not done, this returns the stack where it is suspended. If the coroutine has completed successfully or was cancelled, this returns an empty list. If the coroutine was terminated by an exception, this returns the list of traceback frames. The frames are always ordered from oldest to newest. The optional limit gives the maximum number of frames to return; by default all available frames are returned. Its meaning differs depending on whether a stack or a traceback is returned: the newest frames of a stack are returned, but the oldest frames of a traceback are returned. (This matches the behavior of the traceback module.) For reasons beyond our control, only one stack frame is returned for a suspended coroutine. """ return base_tasks._task_get_stack(self, limit)
Example #13
Source File: tasks.py From Imogen with MIT License | 6 votes |
def __init__(self, coro, *, loop=None): super().__init__(loop=loop) if self._source_traceback: del self._source_traceback[-1] if not coroutines.iscoroutine(coro): # raise after Future.__init__(), attrs are required for __del__ # prevent logging for pending task in __del__ self._log_destroy_pending = False raise TypeError(f"a coroutine was expected, got {coro!r}") self._must_cancel = False self._fut_waiter = None self._coro = coro self._context = contextvars.copy_context() self._loop.call_soon(self.__step, context=self._context) _register_task(self)
Example #14
Source File: gen.py From pySINDy with MIT License | 6 votes |
def __init__(self, gen, result_future, first_yielded): self.gen = gen self.result_future = result_future self.future = _null_future self.yield_point = None self.pending_callbacks = None self.results = None self.running = False self.finished = False self.had_exception = False self.io_loop = IOLoop.current() # For efficiency, we do not create a stack context until we # reach a YieldPoint (stack contexts are required for the historical # semantics of YieldPoints, but not for Futures). When we have # done so, this field will be set and must be called at the end # of the coroutine. self.stack_context_deactivate = None if self.handle_yield(first_yielded): gen = result_future = first_yielded = None self.run()
Example #15
Source File: test_types.py From Fluid-Designer with GNU General Public License v3.0 | 6 votes |
def test_returning_itercoro(self): @types.coroutine def gen(): yield gencoro = gen() @types.coroutine def foo(): return gencoro self.assertIs(foo(), gencoro) # decorate foo second time foo = types.coroutine(foo) self.assertIs(foo(), gencoro)
Example #16
Source File: gen.py From teleport with Apache License 2.0 | 6 votes |
def __init__(self, gen, result_future, first_yielded): self.gen = gen self.result_future = result_future self.future = _null_future self.yield_point = None self.pending_callbacks = None self.results = None self.running = False self.finished = False self.had_exception = False self.io_loop = IOLoop.current() # For efficiency, we do not create a stack context until we # reach a YieldPoint (stack contexts are required for the historical # semantics of YieldPoints, but not for Futures). When we have # done so, this field will be set and must be called at the end # of the coroutine. self.stack_context_deactivate = None if self.handle_yield(first_yielded): gen = result_future = first_yielded = None self.run()
Example #17
Source File: test_inspect.py From Fluid-Designer with GNU General Public License v3.0 | 6 votes |
def test_getcoroutinelocals(self): @types.coroutine def gencoro(): yield gencoro = gencoro() async def func(a=None): b = 'spam' await gencoro coro = func() self.assertEqual(inspect.getcoroutinelocals(coro), {'a': None, 'gencoro': gencoro}) coro.send(None) self.assertEqual(inspect.getcoroutinelocals(coro), {'a': None, 'gencoro': gencoro, 'b': 'spam'})
Example #18
Source File: test_coroutines.py From Fluid-Designer with GNU General Public License v3.0 | 6 votes |
def test_func_5(self): @types.coroutine def bar(): yield 1 async def foo(): await bar() check = lambda: self.assertRaisesRegex( TypeError, "'coroutine' object is not iterable") with check(): for el in foo(): pass # the following should pass without an error for el in bar(): self.assertEqual(el, 1) self.assertEqual([el for el in bar()], [1]) self.assertEqual(tuple(bar()), (1,)) self.assertEqual(next(iter(bar())), 1)
Example #19
Source File: launchpad.py From concurrency2017 with MIT License | 6 votes |
def run_until_complete(self): # Start all the coroutines. for coro in self._new: wait_for = coro.send(None) heapq.heappush(self._waiting, Task(wait_for, coro)) # Keep running until there is no more work to do. while self._waiting: now = datetime.datetime.now() # Get the coroutine with the soonest resumption time. task = heapq.heappop(self._waiting) if now < task.waiting_until: # We're ahead of schedule; wait until it's time to resume. delta = task.waiting_until - now time.sleep(delta.total_seconds()) now = datetime.datetime.now() try: # It's time to resume the coroutine. wait_until = task.coro.send(now) heapq.heappush(self._waiting, Task(wait_until, task.coro)) except StopIteration: # The coroutine is done. pass
Example #20
Source File: test_types.py From Fluid-Designer with GNU General Public License v3.0 | 6 votes |
def test_async_def(self): # Test that types.coroutine passes 'async def' coroutines # without modification async def foo(): pass foo_code = foo.__code__ foo_flags = foo.__code__.co_flags decorated_foo = types.coroutine(foo) self.assertIs(foo, decorated_foo) self.assertEqual(foo.__code__.co_flags, foo_flags) self.assertIs(decorated_foo.__code__, foo_code) foo_coro = foo() def bar(): return foo_coro for _ in range(2): bar = types.coroutine(bar) coro = bar() self.assertIs(foo_coro, coro) self.assertEqual(coro.cr_code.co_flags, foo_flags) coro.close()
Example #21
Source File: test_inspect.py From Fluid-Designer with GNU General Public License v3.0 | 5 votes |
def _coroutinestate(self): return inspect.getcoroutinestate(self.coroutine)
Example #22
Source File: test_pep492.py From Fluid-Designer with GNU General Public License v3.0 | 5 votes |
def test_function_returning_awaitable(self): class Awaitable: def __await__(self): return ('spam',) @asyncio.coroutine def func(): return Awaitable() coro = func() self.assertEqual(coro.send(None), 'spam') coro.close()
Example #23
Source File: test_types.py From Fluid-Designer with GNU General Public License v3.0 | 5 votes |
def test_wrapper_object(self): def gen(): yield @types.coroutine def coro(): return gen() wrapper = coro() self.assertIn('GeneratorWrapper', repr(wrapper)) self.assertEqual(repr(wrapper), str(wrapper)) self.assertTrue(set(dir(wrapper)).issuperset({ '__await__', '__iter__', '__next__', 'cr_code', 'cr_running', 'cr_frame', 'gi_code', 'gi_frame', 'gi_running', 'send', 'close', 'throw'}))
Example #24
Source File: test_inspect.py From Fluid-Designer with GNU General Public License v3.0 | 5 votes |
def setUp(self): @types.coroutine def number_coroutine(): for number in range(5): yield number async def coroutine(): await number_coroutine() self.coroutine = coroutine()
Example #25
Source File: test_types.py From Fluid-Designer with GNU General Public License v3.0 | 5 votes |
def test_gen(self): def gen_func(): yield 1 return (yield 2) gen = gen_func() @types.coroutine def foo(): return gen wrapper = foo() self.assertIsInstance(wrapper, types._GeneratorWrapper) self.assertIs(wrapper.__await__(), gen) for name in ('__name__', '__qualname__', 'gi_code', 'gi_running', 'gi_frame'): self.assertIs(getattr(foo(), name), getattr(gen, name)) self.assertIs(foo().cr_code, gen.gi_code) self.assertEqual(next(wrapper), 1) self.assertEqual(wrapper.send(None), 2) with self.assertRaisesRegex(StopIteration, 'spam'): wrapper.send('spam') gen = gen_func() wrapper = foo() wrapper.send(None) with self.assertRaisesRegex(Exception, 'ham'): wrapper.throw(Exception, Exception('ham')) # decorate foo second time foo = types.coroutine(foo) self.assertIs(foo().__await__(), gen)
Example #26
Source File: test_types.py From Fluid-Designer with GNU General Public License v3.0 | 5 votes |
def test_duck_corogen(self): class CoroGenLike: def send(self): pass def throw(self): pass def close(self): pass def __await__(self): return self def __iter__(self): return self def __next__(self): pass coro = CoroGenLike() @types.coroutine def foo(): return coro self.assertIs(foo(), coro) self.assertIs(foo().__await__(), coro)
Example #27
Source File: test_types.py From Fluid-Designer with GNU General Public License v3.0 | 5 votes |
def test_genfunc(self): def gen(): yield self.assertIs(types.coroutine(gen), gen) self.assertIs(types.coroutine(types.coroutine(gen)), gen) self.assertTrue(gen.__code__.co_flags & inspect.CO_ITERABLE_COROUTINE) self.assertFalse(gen.__code__.co_flags & inspect.CO_COROUTINE) g = gen() self.assertTrue(g.gi_code.co_flags & inspect.CO_ITERABLE_COROUTINE) self.assertFalse(g.gi_code.co_flags & inspect.CO_COROUTINE) self.assertIs(types.coroutine(gen), gen)
Example #28
Source File: test_types.py From Fluid-Designer with GNU General Public License v3.0 | 5 votes |
def test_duck_coro(self): class CoroLike: def send(self): pass def throw(self): pass def close(self): pass def __await__(self): return self coro = CoroLike() @types.coroutine def foo(): return coro self.assertIs(foo(), coro) self.assertIs(foo().__await__(), coro)
Example #29
Source File: test_inspect.py From Fluid-Designer with GNU General Public License v3.0 | 5 votes |
def tearDown(self): self.coroutine.close()
Example #30
Source File: gen.py From pySINDy with MIT License | 5 votes |
def coroutine(func): """Decorator for asynchronous generators. Any generator that yields objects from this module must be wrapped in either this decorator or `engine`. Coroutines may "return" by raising the special exception `Return(value) <Return>`. In Python 3.3+, it is also possible for the function to simply use the ``return value`` statement (prior to Python 3.3 generators were not allowed to also return values). In all versions of Python a coroutine that simply wishes to exit early may use the ``return`` statement without a value. Functions with this decorator return a `.Future`. Additionally, they may be called with a ``callback`` keyword argument, which will be invoked with the future's result when it resolves. If the coroutine fails, the callback will not be run and an exception will be raised into the surrounding `.StackContext`. The ``callback`` argument is not visible inside the decorated function; it is handled by the decorator itself. .. warning:: When exceptions occur inside a coroutine, the exception information will be stored in the `.Future` object. You must examine the result of the `.Future` object, or the exception may go unnoticed by your code. This means yielding the function if called from another coroutine, using something like `.IOLoop.run_sync` for top-level calls, or passing the `.Future` to `.IOLoop.add_future`. .. deprecated:: 5.1 The ``callback`` argument is deprecated and will be removed in 6.0. Use the returned awaitable object instead. """ return _make_coroutine_wrapper(func, replace_callback=True)