非同步裝飾器裝飾協程 非同步方法 坑記錄

2021-10-21 00:15:25 字數 1214 閱讀 1308

預備知識

使用非同步裝飾器裝飾協程比較寫法比較簡單,但是其中有乙個坑,那就是裝飾器中必須await method()呼叫被裝飾協程,否則相當於沒有裝飾。

**

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

# @file : test_async_decorators.py

# @author: itnoobzzy

# @date : 2021/3/4

# @desc : 非同步裝飾器裝飾非同步方法

import functools

import asyncio

def async_decorators(method):

"""非同步裝飾器裝飾非同步方法

:param method: 被裝飾協程(非同步方法)

:return:

"""@functools.wraps(method)

print(f'裝飾器裝飾方法')

# 此處必須await 切換呼叫被裝飾協程,否則不會執行該協程

await method(*args, **kwargs)

@async_decorators

async def test_async_method(*args, **kwargs):

print('該協程被執行')

pass

if __name__ == '__main__':

coroutine = test_async_method()

loop = asyncio.get_event_loop()

task = loop.create_task(coroutine)

loop.run_until_complete(task)

正常執行結果:

裝飾器中去掉await method,可以發現結果只允許了裝飾器(裝飾器會被預載入執行),沒執行被裝飾協程:

非同步I O 協程

什麼是協程呢?協程 coroutines 是一種比執行緒更加輕量級的存在,正如乙個程序可以擁有多個執行緒一樣,乙個執行緒可以擁有多個協程。協程不是被作業系統核心所管理的,而是完全由程式所控制,也就是在使用者態執行。這樣帶來的好處是效能大幅度的提公升,因為不會像執行緒切換那樣消耗資源。協程不是程序也不...

非同步程式設計 協程

現在是 python3.5 以後已經進入非同步時代 python由於gil 全域性鎖 的存在,不能發揮多核的優勢,其效能一直飽受詬病。然而在io密集型的網路程式設計裡,非同步處理比同步處理能提公升成百上千倍的效率,彌補了python效能方面的短板.現有的python 非同步框架 python 中的主...

非同步程式設計 協程

現在是 python3.5 以後已經進入非同步時代 python由於gil 全域性鎖 的存在,不能發揮多核的優勢,其效能一直飽受詬病。然而在io密集型的網路程式設計裡,非同步處理比同步處理能提公升成百上千倍的效率,彌補了python效能方面的短板.現有的python 非同步框架 python 中的主...