要嘗試回答您的問題,我修改了一個來自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