我正在尝试使用Python 3相对较新的asyncio模块正确理解和实现两个并发运行的Task对象。 简而言之,asyncio似乎devise用于处理asynchronous进程和并发Task在事件循环中的执行。 它促进使用await (在asynchronous函数中应用)作为一个无callback的方式来等待并使用一个结果,而不会阻塞事件循环。 (期货和callback仍是一个可行的select。) 它还提供了asyncio.Task()类,这是Future一个专门的子类,用于包装协程。 最好通过使用asyncio.ensure_future()方法来调用。 asyncio任务的预期用途是允许独立运行的任务与同一事件循环内的其他任务“同时”运行。 我的理解是Tasks连接到事件循环,然后在await语句之间自动继续驱动协程。 我喜欢能够使用并发任务而不需要使用某个Executor类的想法,但是我没有find关于实现的详细说明。 这就是我目前的做法: 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 # OPTION 1: wrap in Task object # […]
假设我们有一个虚拟函数: 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(coros)两者都运行协程,那么何时以及为什么要将协程打包在ensure_future ? 基本上,使用Python 3.5的async运行一堆非阻塞操作的正确方法是什么? 额外的信用,如果我想批量打电话? 例如,我需要调用some_remote_call(…) 1000次,但我不想用1000个同时连接粉碎web服务器/数据库/等。 这是可行的线程或进程池,但有没有办法用asyncio做到这asyncio ?
使用Python 3.4 asyncio库为代码编写unit testing的最佳方式是什么? 假设我想testing一个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()) 当使用默认testing运行器运行此testing用例时,testing将始终成功,因为该方法只执行直到第一次yield from指令产生,然后在执行任何断言之前返回。 这导致testing总是成功。 是否有预构build的testing运行器能够处理这样的asynchronous代码?