Questions tagged «python-asyncio»

此标记用于asyncio Python程序包,该程序包提供用于编写​​单线程并发代码的机制。asyncio软件包从Python 3.4开始提供异步I / O,事件循环,协程和任务。

3
Asyncio.gather vs asyncio.wait
asyncio.gather并且asyncio.wait似乎有类似的用法:我有一堆我想执行/等待的异步事情(不一定要等到下一个开始之前完成)。它们使用不同的语法,并且在某些细节上有所不同,但是对我来说,拥有2个功能在功能上有如此大的重叠是非常不切实际的。我想念什么?

4
异步实际上是如何工作的?
这个问题是由我的另一个问题引起的:如何在cdef中等待? 网路上有关于的大量文章和网志文章asyncio,但它们都是非常肤浅的。我找不到任何有关如何asyncio实际实现以及使I / O异步的信息。我正在尝试阅读源代码,但是它是数千行,不是最高等级的C代码,其中很多处理辅助对象,但是最关键的是,很难在Python语法和它将翻译的C代码之间进行连接入。 Asycnio自己的文档甚至没有帮助。那里没有关于它如何工作的信息,只有一些有关如何使用它的指南,有时也会引起误解/写得很差。 我熟悉Go的协程实现,并希望Python做同样的事情。如果是这样的话,我在上面链接的帖子中出现的代码将奏效。既然没有,我现在想找出原因。到目前为止,我最好的猜测如下,请纠正我错的地方: 形式的过程定义async def foo(): ...实际上被解释为类继承的方法coroutine。 也许async def实际上是通过await语句分为多个方法,在这些方法上被调用的对象能够跟踪到目前为止执行所取得的进展。 如果上述条件成立,那么从本质上讲,协程的执行归结为某个全局管理器调用循环对象的方法(循环?)。 全局管理器以某种方式(如何?)知道何时由Python代码执行I / O操作(仅?),并且能够选择当前执行方法放弃控制后执行的待处理协程方法之一(命中该await语句) )。 换句话说,这是我尝试将某些asyncio语法“简化”为更易于理解的内容: async def coro(name): print('before', name) await asyncio.sleep() print('after', name) asyncio.gather(coro('first'), coro('second')) # translated from async def coro(name) class Coro(coroutine): def before(self, name): print('before', name) def after(self, name): print('after', name) def __init__(self, name): …

4
“失火” Python异步/等待
有时需要执行一些非关键性的异步操作,但我不想等待它完成。在Tornado的协程实现中,您可以通过简单地省略yield关键字来“触发并忘记”一个异步函数。 我一直在尝试找出如何使用Python 3.5中发布的新语法async/ 来“激发并忘记” await。例如,一个简化的代码片段: async def async_foo(): print("Do some stuff asynchronously here...") def bar(): async_foo() # fire and forget "async_foo()" bar() 但是,发生的事情是bar()永远不会执行,而是收到运行时警告: RuntimeWarning: coroutine 'async_foo' was never awaited async_foo() # fire and forget "async_foo()"


4
协程和Python 3.5中的future / task之间的区别?
假设我们有一个虚拟函数: async def foo(arg): result = await some_remote_call(arg) return result.upper() 之间有什么区别: coros = [] for i in range(5): coros.append(foo(i)) loop = get_event_loop() loop.run_until_complete(wait(coros)) 和: from asyncio import ensure_future futures = [] for i in range(5): futures.append(ensure_future(foo(i))) loop = get_event_loop() loop.run_until_complete(wait(futures)) 注意:该示例返回结果,但这不是问题的重点。如果返回值很重要,请使用gather()代替wait()。 无论返回值如何,我都希望在上保持清晰ensure_future()。wait(coros)并且wait(futures)都运行协程,那么何时以及为什么要包装协程ensure_future? 基本上,使用Python 3.5运行一堆非阻塞操作的正确方法(tm)是async什么? 为了获得额外的抵免额,如果我要批量处理电话,该怎么办?例如,我需要拨打some_remote_call(...)1000次,但我不想同时连接1000个连接而粉碎Web服务器/数据库/等。这对于线程或进程池是可行的,但是有没有办法做到这一点asyncio?

4
asyncio.ensure_future与BaseEventLoop.create_task与简单协程?
我看过一些关于asyncio的基本Python 3.5教程,以各种方式进行相同的操作。在此代码中: import asyncio async def doit(i): print("Start %d" % i) await asyncio.sleep(3) print("End %d" % i) return i if __name__ == '__main__': loop = asyncio.get_event_loop() #futures = [asyncio.ensure_future(doit(i), loop=loop) for i in range(10)] #futures = [loop.create_task(doit(i)) for i in range(10)] futures = [doit(i) for i in range(10)] result = …

5
如何在__init__中设置带有等待的类属性
如何await在构造函数或类主体中定义类? 例如我想要的: import asyncio # some code class Foo(object): async def __init__(self, settings): self.settings = settings self.pool = await create_pool(dsn) foo = Foo(settings) # it raises: # TypeError: __init__() should return None, not 'coroutine' 或具有类body属性的示例: class Foo(object): self.pool = await create_pool(dsn) # Sure it raises syntax Error def __init__(self, settings): …

10
如何测试Python 3.4异步代码?
使用Python 3.4asyncio库编写代码的单元测试的最佳方法是什么?假设我要测试一个TCP客户端(SocketConnection): import asyncio import unittest class TestSocketConnection(unittest.TestCase): def setUp(self): self.mock_server = MockServer("localhost", 1337) self.socket_connection = SocketConnection("localhost", 1337) @asyncio.coroutine def test_sends_handshake_after_connect(self): yield from self.socket_connection.connect() self.assertTrue(self.mock_server.received_handshake()) 当使用默认测试运行程序运行此测试用例时,测试将始终成功,因为该方法仅执行到第一yield from条指令为止,然后在执行任何断言之前返回该指令。这导致测试始终成功。 是否有一个预构建的测试运行器能够处理这样的异步代码?

2
如何使用python的asyncio模块正确创建和运行并发任务?
我正在尝试Task使用Python 3的相对较新的asyncio模块正确理解和实现两个同时运行的对象。 简而言之,asyncio似乎旨在处理Task事件循环中的异步过程和并发执行。它促进了await(应用于异步函数中)作为无回调方式等待和使用结果的使用,而不会阻塞事件循环。(期货和回调仍然是可行的选择。) 它还提供了asyncio.Task()该类,该类是Future 设计用于包装协程的专门子类。最好通过使用该asyncio.ensure_future()方法来调用。异步任务的预期用途是允许独立运行的任务与同一事件循环中的其他任务“同时”运行。我的理解是Tasks连接到事件循环,然后该循环自动继续驱动await语句之间的协程。 我喜欢无需使用任何一个Executor类就可以使用并发Task的想法,但是在实现方面我没有发现太多细节。 这是我目前正在做的事情: import asyncio print('running async test') async def say_boo(): i = 0 while True: await asyncio.sleep(0) print('...boo {0}'.format(i)) i += 1 async def say_baa(): i = 0 while True: await asyncio.sleep(0) print('...baa {0}'.format(i)) i += 1 # wrap in Task object # -> automatically …

6
如何定期使用asyncio执行功能?
我从迁移tornado到asyncio了,我找不到asyncio等效tornado的PeriodicCallback。(APeriodicCallback有两个参数:要运行的函数和两次调用之间的毫秒数。) 有这样的等同物asyncio吗? 如果没有,那么在不冒RecursionError一会儿风险的情况下,最干净的方法是什么呢?

2
如何在Jupyter Notebook中使用django 3.0 ORM而不触发异步上下文检查?
Django 3.0增加了asgi / async支持,并提供了在异步上下文中发出同步请求的保护措施。同时,IPython刚刚添加了顶级的async / await支持,它似乎在默认事件循环内运行整个解释器会话。 不幸的是,这两个大加法的结合意味着jupyter笔记本中的任何django ORM操作都会导致SynchronousOnlyOperation异常: SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async. 如异常消息所述,可以将每个ORM调用包装为以下形式sync_to_async(): images = await sync_to_async(Image.objects.all)() 但这不是很方便,特别是对于通常在属性查找中隐式解析的相关字段。 (我尝试了%autoawait off魔术,但没有用,从快速浏览一下我假设的文档开始是因为ipykernels始终在asyncio循环中运行) 那么有没有办法在Django中禁用异步上下文检查中的同步或在同步上下文中运行ipykernel? 对于上下文:我编写了一个数据科学软件包,该软件包使用django作为后端服务器,但还在ORM上公开了基于jupyter的界面,该界面允许您在jupyter笔记本中清理/注释数据,跟踪机器学习实验并运行培训作业。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.