2016-10-22 96 views
3

我开始学习异步代码,并且已经阅读了很多,但我似乎找不到非常简单的示例来自己尝试并更好地理解它。python中的一个非常简单的异步应用程序

我想编写一个简单的Python(最好3.5)程序,执行以下操作:

1)调用虚拟异步函数dummy(),只是等待几秒钟,返回的东西
2)继续做的东西直到dummy()回报的东西
3)dummy()检索的返回值,并把一个变量
4)继续做好东西

我怎样才能做到这一点?

编辑:
很抱歉,如果这个不清楚,但我知道如何做到这一点使用线程。我打算使用异步等待语句和asyncio模块来执行此操作。

+1

如果你真的想将它写自己,不是别人从社区,你可以开始阅读python文档[asyncio](https://docs.python.org/3/library/asyncio.html) – agg3l

回答

3

要尝试回答您的问题,我修改了一个来自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() 
+0

谢谢,但:我如何继续做**其他**的东西,而 – user3134477

+0

谢谢,但是当'my_coroutine'实例正在运行时,我如何继续执行**其他**内容?我怎样在使用'run_until_complete'时获得返回值? – user3134477

+1

@ user3134477每次协程到达yield语句时,事件循环都会给另一个协程赋予执行时间。所以你的其他的东西只是进入另一个协程。 – intrepidhero

1

坚持你的问题(因为有其他的方式来实现你想要的),一个简单的答案会是如下:

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!'] 
+1

这可能是获得该功能的最简单方法,但我相信OP需要使用['async']的解决方案(https://docs.python.org/3/reference/compound_stmts.html#coroutine-function-definition ) – zvone

+0

@zvone我看不出你是如何相信这一点的,因为他说“但我似乎无法找到非常简单的例子来亲自尝试并更好地理解它”。从这一点上,我明白他只是想要一个简单的实例来做他在他的问题中解释的事情。 – ettanany

+0

这是我的结论,基于使用word * async *。但问题不明确。如果有某种尝试的例子,它会更容易理解。 – zvone

相关问题