Optimized @async_unsafe.

Switched the order of the checks to reduce the overhead. Async unsafe methods
are *normally* called syncrhonously, so we can avoid the overhead of checking
the environment variable in the regular path.
This commit is contained in:
Adam Johnson 2021-09-29 09:47:24 +01:00 committed by Carlton Gibson
parent 7b8beeee3d
commit 37d9ea5d5c
1 changed files with 10 additions and 10 deletions

View File

@ -1,6 +1,6 @@
import asyncio
import functools
import os import os
from asyncio import get_running_loop
from functools import wraps
from django.core.exceptions import SynchronousOnlyOperation from django.core.exceptions import SynchronousOnlyOperation
@ -11,15 +11,15 @@ def async_unsafe(message):
the function while in an async context will get an error message. the function while in an async context will get an error message.
""" """
def decorator(func): def decorator(func):
@functools.wraps(func) @wraps(func)
def inner(*args, **kwargs): def inner(*args, **kwargs):
if not os.environ.get('DJANGO_ALLOW_ASYNC_UNSAFE'): # Detect a running event loop in this thread.
# Detect a running event loop in this thread. try:
try: get_running_loop()
asyncio.get_running_loop() except RuntimeError:
except RuntimeError: pass
pass else:
else: if not os.environ.get('DJANGO_ALLOW_ASYNC_UNSAFE'):
raise SynchronousOnlyOperation(message) raise SynchronousOnlyOperation(message)
# Pass onward. # Pass onward.
return func(*args, **kwargs) return func(*args, **kwargs)