要尝试回答您的问题,我修改了一个来自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运行,同时计算正在等待。
我发现异步编程真的很难涵盖我的想法。但我认为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()
如果你真的想将它写自己,不是别人从社区,你可以开始阅读python文档[asyncio](https://docs.python.org/3/library/asyncio.html) – agg3l