为了回答你的问题,我修改了asyncio文档中的一个示例,并增加了更多你所要求的内容。详情请见:
https://docs.python.org/3/library/asyncio-task.html。
import asyncio
result2 = 0
async def compute(x, y):
print("Compute %s + %s ..." % (x, y))
await asyncio.sleep(1.0)
result2 = x*y
return x + y
async def print_sum(x, y):
result = await compute(x, y)
print("%s + %s = %s" % (x, y, result))
async def dosomethingelse():
print("I've got a lovely bunch of coconuts")
loop = asyncio.get_event_loop()
tasks = [print_sum(1, 2),
dosomethingelse(),
compute(2, 4)
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
print(result2)
如果您运行上面的代码,您应该看到dosomethingelse正在运行,而compute正在等待。
我发现异步编程真的很难理解。但是我认为asyncio比线程或多进程更加直观,因为所有东西都在同一个内存空间中运行,而且(像这样简单的协程)程序流程完全是顺序的。第一个任务运行直到遇到一个await,然后下一个任务有机会运行,以此类推。我强烈建议阅读模块文档,并尝试编写一些示例来探索每个主题。从协程开始,然后是链接,最后是回调。
编辑:我将保留此处内容,因为我认为这是一个很好的简单示例。如果您不同意,请评论。请注意,yield from语法是因为我当时使用的是稍早版本的Python 3。
我不记得我在看哪个教程,但这是我编写的第一个asyncio测试之一。
import asyncio
@asyncio.coroutine
def my_coroutine(task_name, seconds_to_sleep=3):
print("{0} sleeping for: {1} seconds".format(task_name, seconds_to_sleep))
yield from asyncio.sleep(seconds_to_sleep)
print("{0} is finished".format(task_name))
loop = asyncio.get_event_loop()
tasks = [my_coroutine("task1", 4),
my_coroutine("task2", 2),
my_coroutine("task3", 10)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()