python 中的一个非常简单的异步应用程序
A very simple asynchronous application in python
我开始学习异步代码,也看了很多,但是就是找不到很简单的例子自己尝试一下,加深理解。
我想编写一个简单的 Python(最好是 3.5)程序来执行以下操作:
1) 调用虚拟异步函数 dummy()
只等待几秒钟 returns something
2) 继续做事,直到 dummy()
return 某事
3) 从 dummy()
中检索 return 值并放入变量
4) 继续做事
我该怎么做?
编辑:
抱歉,如果不清楚,但我知道如何使用线程来做到这一点。我的目标是使用 async-await 语句和 asyncio 模块来做到这一点。
为了尝试回答您的问题,我修改了 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 运行s,而计算正在等待。
我发现异步编程真的很难让我全神贯注。但我认为 asyncio 实际上比线程或多处理要简单得多,因为所有 运行 都在同一内存中 space 并且(使用像这样的简单协程)程序流是完全顺序的。第一个任务 运行s 直到它命中 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()
坚持你的问题(因为还有其他方法可以实现你想要的),一个简单的答案如下:
import threading
import time
results = []
def dummy():
time.sleep(2)
results.append("This function result!")
return
t = threading.Thread(target=dummy)
t.start()
while t.isAlive():
print('Something')
print(results) # ['This function result!']
我开始学习异步代码,也看了很多,但是就是找不到很简单的例子自己尝试一下,加深理解。
我想编写一个简单的 Python(最好是 3.5)程序来执行以下操作:
1) 调用虚拟异步函数 dummy()
只等待几秒钟 returns something
2) 继续做事,直到 dummy()
return 某事
3) 从 dummy()
中检索 return 值并放入变量
4) 继续做事
我该怎么做?
编辑:
抱歉,如果不清楚,但我知道如何使用线程来做到这一点。我的目标是使用 async-await 语句和 asyncio 模块来做到这一点。
为了尝试回答您的问题,我修改了 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 运行s,而计算正在等待。
我发现异步编程真的很难让我全神贯注。但我认为 asyncio 实际上比线程或多处理要简单得多,因为所有 运行 都在同一内存中 space 并且(使用像这样的简单协程)程序流是完全顺序的。第一个任务 运行s 直到它命中 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()
坚持你的问题(因为还有其他方法可以实现你想要的),一个简单的答案如下:
import threading
import time
results = []
def dummy():
time.sleep(2)
results.append("This function result!")
return
t = threading.Thread(target=dummy)
t.start()
while t.isAlive():
print('Something')
print(results) # ['This function result!']