2016-10-22 82 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

相關問題