Python3 协程asynico问题

协程的切换不同于线程切换,是由程序自身控制的,没有切换的开销。协程不需要多线程的锁机制,因为都是在同一个线程中运行,所以没有同时访问数据的问题,执行效率比多线程高很多。
因为协程是单线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
举个例子:

import asyncio


async def display(num):
    at = 5
    t = 1
    while True:
        print('Loop: ' + str(num) + ' at: ' + str(at) + ' t:' + str(t))
        if t >= at:
            break
        t += 1
        await asyncio.sleep(2)


loop = asyncio.get_event_loop()
tasks = [display(1), display(2)]
loop.run_until_complete(asyncio.gather(*tasks))
loop.close()

我们可以看到当所有协程都执行完成后,程序才会停止。
输出如下:

Loop: 1 at: 5 t:1
Loop: 2 at: 5 t:1
Loop: 1 at: 5 t:2
Loop: 2 at: 5 t:2
Loop: 1 at: 5 t:3
Loop: 2 at: 5 t:3
Loop: 1 at: 5 t:4
Loop: 2 at: 5 t:4
Loop: 1 at: 5 t:5
Loop: 2 at: 5 t:5

运行循环有两种方法:一是调用run_until_complete()方法,二是调用run_forever()方法。run_until_complete()内置add_done_callback回调函数,run_forever()则可以自定义add_done_callback()。
使用run_until_complete()方法举个例子:

import asyncio


async def display(future):
    await asyncio.sleep(2)
    future.set_result('display over!')

loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(display(future))
print(loop.is_running())
loop.run_until_complete(future)
print(future.result())
loop.close()

可以看到我们给future传递了一个字符串。
输出如下:

False
display over!

使用run_forever()方法再举个例子:

import asyncio


async def display(future):
    await asyncio.sleep(2)
    future.set_result('display over!')


def call_result(future):
    print(future.result())
    loop.stop()


loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(display(future))
future.add_done_callback(call_result)
try:
    loop.run_forever()
finally:
    loop.close()

可以看到我们使用add_done_callback这个函数将自定的回调函数传入。最终得到我们想要的结果如下:

display over!

以上就是Python3 协程asynico的一些问题了。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页