async def
при их определении, чтобы декоратор сам являлся корутиной. Пример:
async def my_decorator(func):
async def wrapper(*args, **kwargs):
# Предварительные действия
result = await func(*args, **kwargs)
# Пост-действия
return result
return wrapper
@my_decorator
async def my_async_function():
return "Result"
Важно использовать await
при вызове декорируемой функции внутри декоратора, чтобы не заблокировать event loop.
Применение декораторов к асинхронным функциям в Python требует особого подхода, поскольку обычные декораторы блокируют event loop, что сводит на нет преимущества асинхронности. Чтобы этого избежать, нужно использовать `async` ключевое слово при определении декоратора и его внутренней оберточной функции.
Вот пример базовой структуры асинхронного декоратора:
import asyncio
import functools
def async_decorator(func):
@functools.wraps(func)
async def wrapper(*args, **kwargs):
# Код перед выполнением асинхронной функции
print("Перед выполнением функции:", func.__name__)
result = await func(*args, **kwargs) # Ожидаем результат асинхронной функции
# Код после выполнения асинхронной функции
print("После выполнения функции:", func.__name__)
return result
return wrapper
@async_decorator
async def my_async_function(arg):
print(f"Выполняется асинхронная функция с аргументом: {arg}")
await asyncio.sleep(1) # Эмуляция асинхронной операции
return f"Результат: {arg}"
async def main():
result = await my_async_function("Привет")
print(result)
if __name__ == "__main__":
asyncio.run(main())
Разберем код:
Примеры использования:
Важно помнить:
Этот подход обеспечивает, что декоратор не блокирует event loop и позволяет асинхронным функциям работать эффективно.