1. 程式人生 > >asyncio協程並發

asyncio協程並發

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協程並發