asyncio協程並發
阿新 • • 發佈:2018-08-25
orm python \n eat 必須 done await work tor
# # Generator with yield # astr = ‘ABC‘ alist = [1, 2, 3] adict = dict(name=‘kct‘, age=18) agen = (i for i in range(5)) def gen(*args): for item in args: for i in item: yield i new_list = gen(astr, alist, adict, agen) print("use yield:", list(new_list)) # # Generator with yield from # def fgen(*args): for item in args: yield from item bgen = (i for i in range(5)) new_flist = fgen(astr, alist, adict, bgen) print("use yield from:", list(new_flist)) # # asyncio # from collections.abc import Coroutine async def hello(name): print(‘Hello, ‘, name) # coroutine = hello(‘World‘) # print(isinstance(coroutine, Coroutine)) # # asyncio # import asyncio from collections.abc import Generator # 使用這個裝飾器將該生成器標記為協程對象,本質還是生成器,所以內部不能使用await @asyncio.coroutine def hello2(): yield from asyncio.sleep(1) coroutine = hello2() print("Is generator:{}\nIs coroutine:{}\n".format( isinstance(coroutine, Generator), isinstance(coroutine, Coroutine) )) # # asyncio # coroutine = hello(‘World‘) # 創建事件循環 loop = asyncio.get_event_loop() # 將協程轉換為任務 task = loop.create_task(coroutine) # 將任務放入事件循環對象中觸發 loop.run_until_complete(task) # yield from 後可接iterable或future或Coroutine對象 # await 後必須接future或Coroutine對象 # # asyncio # from asyncio.futures import Future func = asyncio.sleep(2) print("Is func Future:", isinstance(func, Future)) print("Is func Coroutine:", isinstance(func, Coroutine)) # # 創建Future對象 # task = asyncio.ensure_future(coroutine) print("Is task Future:", isinstance(task, Future)) # # 對象測試 # import sys async def f1(): await asyncio.sleep(2) print(‘Hello, ‘, sys._getframe().f_code.co_name) def f2(): yield from asyncio.sleep(2) print(‘Hello, ‘, sys._getframe().f_code.co_name) async def f3(): await asyncio.ensure_future(asyncio.sleep(2)) print(‘Hello, ‘, sys._getframe().f_code.co_name) def f4(): yield from asyncio.ensure_future(asyncio.sleep(2)) print(‘Hello, ‘, sys._getframe().f_code.co_name) # # 回調函數獲取結果 # import time async def _sleep(x): time.sleep(x) return ‘Stopped {} seconds!‘.format(x) coroutine = _sleep(2) loop = asyncio.get_event_loop() task = asyncio.ensure_future(coroutine) loop.run_until_complete(task) # 直接通過task獲取任務結果 print(‘Result: {}‘.format(task.result())) def callback(future): print(‘Result: {}‘.format(future.result())) coroutine = _sleep(2) loop = asyncio.get_event_loop() task = asyncio.ensure_future(coroutine) # 通過future獲取結果 task.add_done_callback(callback) loop.run_until_complete(task) # # 協程並發 # # 協程函數 async def worker(n): print(‘Waiting: {}‘.format(n)) await asyncio.sleep(n) return ‘Done {}‘.format(sys._getframe().f_code.co_name) # 協程對象 c1 = worker(1) c2 = worker(2) c3 = worker(4) # 協程轉換為task tasks = [ asyncio.ensure_future(c1), asyncio.ensure_future(c2), asyncio.ensure_future(c3) ] loop = asyncio.get_event_loop() # 註冊到事件循環(一) # loop.run_until_complete(asyncio.wait(tasks)) # 註冊到事件循環(二) loop.run_until_complete(asyncio.gather(*tasks)) # 結果 for task in tasks: print(‘Result: {}‘.format(task.result()))
asyncio協程並發