Python源码示例:asyncio.coroutine()
示例1
def run_sync(func: Callable[..., Any]) -> Callable[..., Coroutine[Any, None, None]]:
"""Ensure that the sync function is run within the event loop.
If the *func* is not a coroutine it will be wrapped such that
it runs in the default executor (use loop.set_default_executor
to change). This ensures that synchronous functions do not
block the event loop.
"""
@wraps(func)
async def _wrapper(*args: Any, **kwargs: Any) -> Any:
loop = asyncio.get_running_loop()
result = await loop.run_in_executor(
None, copy_context().run, partial(func, *args, **kwargs)
)
if isgenerator(result):
return run_sync_iterable(result) # type: ignore
else:
return result
_wrapper._quart_async_wrapper = True # type: ignore
return _wrapper
示例2
def test_retry_with_asyncio(mock_client, mock_response):
import asyncio
@asyncio.coroutine
def coroutine():
return mock_response
# Setup
mock_response.with_json({"id": 123, "name": "prkumar"})
mock_client.with_side_effect([Exception, coroutine()])
mock_client.with_io(io.AsyncioStrategy())
github = GitHub(base_url=BASE_URL, client=mock_client)
# Run
awaitable = github.get_user("prkumar")
loop = asyncio.get_event_loop()
response = loop.run_until_complete(asyncio.ensure_future(awaitable))
# Verify
assert len(mock_client.history) == 2
assert response.json() == {"id": 123, "name": "prkumar"}
示例3
def test_request_send(self, mocker, aiohttp_session_mock):
# Setup
import asyncio
expected_response = mocker.Mock()
@asyncio.coroutine
def request(*args, **kwargs):
return expected_response
aiohttp_session_mock.request = request
client = aiohttp_.AiohttpClient(aiohttp_session_mock)
# Run
response = client.send((1, 2, {}))
loop = asyncio.get_event_loop()
value = loop.run_until_complete(asyncio.ensure_future(response))
# Verify
assert value == expected_response
示例4
def test_wrap_callback(self, mocker):
import asyncio
# Setup
c = AiohttpClient()
mocker.spy(c, "_sync_callback_adapter")
# Run: with callback that is not a coroutine
def callback(*_):
pass
c.wrap_callback(callback)
# Verify: Should wrap it
c._sync_callback_adapter.assert_called_with(callback)
# Run: with coroutine callback
coroutine_callback = asyncio.coroutine(callback)
assert c.wrap_callback(coroutine_callback) is coroutine_callback
示例5
def test_threaded_response(self, mocker):
# Setup
import asyncio
@asyncio.coroutine
def coroutine():
return 1
def not_a_coroutine():
return 2
response = mocker.Mock()
response.coroutine = coroutine
response.not_coroutine = not_a_coroutine
threaded_response = aiohttp_.ThreadedResponse(response)
# Run
threaded_coroutine = threaded_response.coroutine
return_value = threaded_coroutine()
# Verify
assert isinstance(threaded_coroutine, aiohttp_.ThreadedCoroutine)
assert return_value == 1
assert threaded_response.not_coroutine is not_a_coroutine
示例6
def create(cls, *args, **kwargs):
"""
Builds a client instance with
:py:class:`aiohttp.ClientSession` arguments.
Instead of directly initializing this class with a
:py:class:`aiohttp.ClientSession`, use this method to have the
client lazily construct a session when sending the first
request. Hence, this method guarantees that the creation of the
underlying session happens inside of a coroutine.
Args:
*args: positional arguments that
:py:class:`aiohttp.ClientSession` takes.
**kwargs: keyword arguments that
:py:class:`aiohttp.ClientSession` takes.
"""
session_build_args = cls._create_session(*args, **kwargs)
return AiohttpClient(session=session_build_args)
示例7
def test_run_hub(self, data):
Hub.hubs = []
sensor_name = 'sensor'
sensor = data.draw(st.sampled_from(self.sensor_list))
capabilities = self._draw_capabilities(data, sensor)
hub_type = data.draw(st.sampled_from(self.hub_list))
TestHub, stop_evt = self._get_hub_class(hub_type, sensor, sensor_name, capabilities)
hub = TestHub('test_hub')
# Start the hub
#kernel.run(self._emit_control(TestHub))
with patch('Adafruit_BluefruitLE.get_provider') as ble,\
patch('bricknil.ble_queue.USE_BLEAK', False) as use_bleak:
ble.return_value = MockBLE(hub)
sensor_obj = getattr(hub, sensor_name)
sensor_obj.send_message = Mock(side_effect=coroutine(lambda x,y: "the awaitable should return this"))
kernel.run(self._emit_control, data, hub, stop_evt, ble(), sensor_obj)
#start(system)
示例8
def emulate(self, *coroutines: Iterable[asyncio.coroutine]):
""" Convenience method that runs a full method in a blocking manner.
Performs connect, run, and then disconnect.
Parameters:
*coroutines -- any asyncio coroutines to be executed concurrently
with our emulation
"""
self.connect()
try:
self.run_with(*coroutines)
except KeyboardInterrupt:
pass
finally:
self.disconnect()
#
# I/O interface.
#
示例9
def async_test(func):
@functools.wraps(func)
def _async_test(*args, **kw):
cofunc = asyncio.coroutine(func)
oldloop = asyncio.get_event_loop()
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.set_debug(True)
console = SharedConsole(interval=0)
results = SharedCounters(
"WORKER", "REACHED", "RATIO", "OK", "FAILED", "MINUTE_OK", "MINUTE_FAILED"
)
kw["loop"] = loop
kw["console"] = console
kw["results"] = results
try:
loop.run_until_complete(cofunc(*args, **kw))
finally:
loop.stop()
loop.close()
asyncio.set_event_loop(oldloop)
return _async_test
示例10
def _connect(self):
"""
Connect to the stream
Returns
-------
asyncio.coroutine
The streaming response
"""
logger.debug("connecting to the stream")
await self.client.setup
if self.session is None:
self.session = self.client._session
kwargs = await self.client.headers.prepare_request(**self.kwargs)
request = self.client.error_handler(self.session.request)
return await request(timeout=0, **kwargs)
示例11
def test_changes_continuous_reading(self):
ids = [utils.uuid() for _ in range(3)]
@asyncio.coroutine
def task():
for idx in ids:
yield from self.db[idx].update({})
asyncio.Task(task())
with (yield from self.db.changes(feed='continuous',
timeout=1000)) as feed:
while True:
self.assertTrue(feed.is_active())
event = yield from feed.next()
if event is None:
break
self.assertIsInstance(event, dict)
self.assertIn(event['id'], ids)
self.assertFalse(feed.is_active())
示例12
def test_changes_eventsource(self):
ids = [utils.uuid() for _ in range(3)]
@asyncio.coroutine
def task():
for idx in ids:
yield from self.db[idx].update({})
asyncio.Task(task())
with (yield from self.db.changes(feed='eventsource',
timeout=1000)) as feed:
while True:
self.assertTrue(feed.is_active())
event = yield from feed.next()
if event is None:
break
self.assertIsInstance(event, dict)
self.assertIn(event['id'], ids)
示例13
def load_events(self):
"""Load more events for this conversation (coroutine)"""
# Don't try to load while we're already loading.
if not self.is_loading and not self.first_loaded:
logger.debug('Loading more conversation events')
self.is_loading = True
try:
conv_events = yield from self.conv.get_events(self.conv.events[0].id_)
except (IndexError, hangups.NetworkError):
conv_events = []
if conv_events:
self.scroll_prev_height = self.messagesWebView.page().mainFrame().contentsSize().height()
else:
self.first_loaded = True
for event in reversed(conv_events):
self.on_event(event, set_title=False, set_unread=False, prepend=True)
self.is_loading = False
示例14
def _do_heartbeat(self):
while True:
try:
if self._socket.getsockopt(zmq.TYPE) == zmq.ROUTER:
yield from self._do_router_heartbeat()
elif self._socket.getsockopt(zmq.TYPE) == zmq.DEALER:
yield from self._do_dealer_heartbeat()
yield from asyncio.sleep(self._heartbeat_interval,
loop=self._event_loop)
except CancelledError: # pylint: disable=try-except-raise
# The concurrent.futures.CancelledError is caught by asyncio
# when the Task associated with the coroutine is cancelled.
# The raise is required to stop this component.
raise
except Exception as e: # pylint: disable=broad-except
LOGGER.exception(
"An error occurred while sending heartbeat: %s", e)
示例15
def test_wait_ping(echo):
proto = MockDiscoveryProtocol([])
node = random_node()
# Schedule a call to proto.recv_ping() simulating a ping from the node we expect.
recv_ping_coroutine = asyncio.coroutine(lambda: proto.recv_ping_v4(node, echo, b""))
asyncio.ensure_future(recv_ping_coroutine())
got_ping = await proto.wait_ping(node)
assert got_ping
# Ensure wait_ping() cleaned up after itself.
assert node not in proto.ping_callbacks
# If we waited for a ping from a different node, wait_ping() would timeout and thus return
# false.
recv_ping_coroutine = asyncio.coroutine(lambda: proto.recv_ping_v4(node, echo, b""))
asyncio.ensure_future(recv_ping_coroutine())
node2 = random_node()
got_ping = await proto.wait_ping(node2)
assert not got_ping
assert node2 not in proto.ping_callbacks
示例16
def test_bond():
proto = MockDiscoveryProtocol([])
node = random_node()
token = b"token"
# Do not send pings, instead simply return the pingid we'd expect back together with the pong.
proto.send_ping_v4 = lambda remote: token
# Pretend we get a pong from the node we are bonding with.
proto.wait_pong_v4 = asyncio.coroutine(lambda n, t: t == token and n == node)
bonded = await proto.bond(node)
assert bonded
# If we try to bond with any other nodes we'll timeout and bond() will return False.
node2 = random_node()
bonded = await proto.bond(node2)
assert not bonded
示例17
def test_update_routing_table_triggers_bond_if_eviction_candidate():
proto = MockDiscoveryProtocol([])
old_node, new_node = random_node(), random_node()
bond_called = False
def bond(node):
nonlocal bond_called
bond_called = True
assert node == old_node
proto.bond = asyncio.coroutine(bond)
# Pretend our routing table failed to add the new node by returning the least recently seen
# node for an eviction check.
proto.routing.add_node = lambda n: old_node
proto.update_routing_table(new_node)
assert new_node not in proto.routing
# The update_routing_table() call above will have scheduled a future call to proto.bond() so
# we need to yield here to give it a chance to run.
await asyncio.sleep(0.001)
assert bond_called
示例18
def with_minimal_session(func):
"""
Pass the current login session information to the function
Do not include extra session information, intended for master.html. Useful for
places that need the current user, but shouldn't (or don't need to) call
botinteract.
Usage:
@server.app.route('/path')
@with_minimal_session
def handler(session):
...
"""
@functools.wraps(func)
async def wrapper(*args, **kwargs):
kwargs['session'] = await load_session(include_url=False, include_header=False)
return await asyncio.coroutine(func)(*args, **kwargs)
return wrapper
示例19
def require_mod(func):
"""
Like with_session, but if the user isn't logged in,
send them via the login screen. If the user isn't
a moderator, kick them out.
"""
@functools.wraps(func)
async def wrapper(*args, **kwargs):
session = await load_session()
if session['user']['id'] is not None:
kwargs['session'] = session
if session['user']['is_mod']:
return await asyncio.coroutine(func)(*args, **kwargs)
else:
return flask.render_template('require_mod.html', session=session)
else:
return await login(session['url'])
return wrapper
示例20
def pytest_pyfunc_call(pyfuncitem):
"""
Run asyncio marked test functions in an event loop instead of a normal
function call.
"""
if 'run_loop' in pyfuncitem.keywords:
funcargs = pyfuncitem.funcargs
loop = funcargs['loop']
testargs = {arg: funcargs[arg]
for arg in pyfuncitem._fixtureinfo.argnames}
if not asyncio.iscoroutinefunction(pyfuncitem.obj):
func = asyncio.coroutine(pyfuncitem.obj)
else:
func = pyfuncitem.obj
loop.run_until_complete(func(**testargs))
return True
示例21
def run_test(self, test_fn):
@asyncio.coroutine
def async_test_fn():
test_fn()
asyncio.get_event_loop().run_until_complete(async_test_fn())
示例22
def run_test(self, test_fn):
@asyncio.coroutine
def async_test_fn():
test_fn()
asyncio.get_event_loop().run_until_complete(async_test_fn())
示例23
def new_ensure_async( # type: ignore
self, func: Callable[..., Any]
) -> Callable[..., Awaitable[Any]]:
if is_coroutine_function(func):
return func
else:
return asyncio.coroutine(func)
示例24
def ensure_coroutine(func: Callable) -> Callable:
warnings.warn(
"Please switch to using a coroutine function. "
"Synchronous functions will not be supported in 0.13 onwards.",
DeprecationWarning,
)
if is_coroutine_function(func):
return func
else:
async_func = asyncio.coroutine(func)
async_func._quart_async_wrapper = True # type: ignore
return async_func
示例25
def is_coroutine_function(func: Any) -> bool:
# Python < 3.8 does not correctly determine partially wrapped
# coroutine functions are coroutine functions, hence the need for
# this to exist. Code taken from CPython.
if sys.version_info >= (3, 8):
return asyncio.iscoroutinefunction(func)
else:
# Note that there is something special about the CoroutineMock
# such that it isn't determined as a coroutine function
# without an explicit check.
try:
from asynctest.mock import CoroutineMock
if isinstance(func, CoroutineMock):
return True
except ImportError:
# Not testing, no asynctest to import
pass
while inspect.ismethod(func):
func = func.__func__
while isinstance(func, functools.partial):
func = func.func
if not inspect.isfunction(func):
return False
result = bool(func.__code__.co_flags & inspect.CO_COROUTINE)
return result or getattr(func, "_is_coroutine", None) is asyncio.coroutines._is_coroutine
示例26
def connection_made(self, transport):
"""
The connection has been made. Here we need to save off our transport,
do basic HTTP/2 connection setup, and then start our data writing
coroutine.
"""
self.transport = transport
self.conn.initiate_connection()
self.transport.write(self.conn.data_to_send())
self._send_loop_task = self._loop.create_task(self.sending_loop())
示例27
def connection_lost(self, exc):
"""
With the end of the connection, we just want to cancel our data sending
coroutine.
"""
self._send_loop_task.cancel()
示例28
def window_opened(self, event):
"""
The flow control window got opened.
This is important because it's possible that we were unable to send
some WSGI data because the flow control window was too small. If that
happens, the sending_loop coroutine starts buffering data.
As the window gets opened, we need to unbuffer the data. We do that by
placing the data chunks back on the back of the send queue and letting
the sending loop take another shot at sending them.
This system only works because we require that each stream only have
*one* data chunk in the sending queue at any time. The threading events
force this invariant to remain true.
"""
if event.stream_id:
# This is specific to a single stream.
if event.stream_id in self._flow_controlled_data:
self._stream_data.put_nowait(
self._flow_controlled_data.pop(event.stream_id)
)
else:
# This event is specific to the connection. Free up *all* the
# streams. This is a bit tricky, but we *must not* yield the flow
# of control here or it all goes wrong.
for data in self._flow_controlled_data.values():
self._stream_data.put_nowait(data)
self._flow_controlled_data = {}
示例29
def get(self, service, path, **kwargs):
""" Make a get request (this returns a coroutine)"""
return self.make_request(Methods.GET, service, path, **kwargs)
示例30
def post(self, service, path, body, **kwargs):
""" Make a post request (this returns a coroutine)"""
return self.make_request(Methods.POST, service, path, body=body,
**kwargs)