asyncio协程并发

Posted ikct2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asyncio协程并发相关的知识,希望对你有一定的参考价值。

#
# 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:{}
Is coroutine:{}
".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协程并发的主要内容,如果未能解决你的问题,请参考以下文章

python协程--asyncio模块(基础并发测试)

asyncio并发编程

asyncio协程并发

Python协程之asyncio

asyncio:Python异步编程模块

Python Module — asyncio 协程并发