<p>您可以在调用<code>loop.run_forever()</code>之前安排多个并发异步任务。在</p>
<pre><code>@asyncio.coroutine
def other_task_coroutine():
pass # do something
start_tcp_server_task = loop.create_task(loop.create_server(
EchoServerClientProtocol, '127.0.0.1', 8888))
other_task = loop.create_task(other_task_coroutine())
self.run_forever()
</code></pre>
<p>当您调用<code>loop.create_task(loop.create_server())</code>或<code>loop.create_task(other_task_coroutine())</code>时,<em>实际上没有执行任何东西</em>:创建一个协程对象并将其包装在任务中(将任务视为shell,将在任务中执行的代码的实例)。任务在创建时在循环中进行调度。在</p>
<p>循环将首先执行<code>start_tcp_server_task</code>(因为它是先安排的),直到阻塞IO事件挂起或被动套接字准备好侦听传入的连接。在</p>
<p>您可以将asyncio看作是一个运行在一个CPU上的不可抢占调度器:一旦第一个任务本身中断或完成,第二个任务将被执行。因此,当一个任务被执行时,另一个任务必须等到正在运行的任务完成或产生(或者在Python3.5中是“等待”)生成“(<code>yield from client.read()</code>)或“waiting”(<code>await client.read()</code>)意味着任务将手交给循环的调度器,直到<code>client.read()</code>可以执行(数据在套接字上可用)。在</p>
<p>一旦任务将控制权交还给循环,它就可以调度其他挂起的任务、处理传入的事件以及调度等待这些事件的任务。一旦无事可做,循环将执行进程的唯一阻塞调用:休眠,直到内核通知它事件已准备就绪。在</p>
<p>在这种情况下,您必须理解,当使用asyncio时,流程中运行的所有内容都必须异步运行,这样循环才能正常工作。不能在循环中使用多处理对象。在</p>
<p>注意,<code>asyncio.async(coroutine(), loop=loop)</code>等同于<code>loop.create_task(coroutine())</code>。在</p>