Запуск приложения uWSGI, которое напрямую использует uwsgidecorators из оболочки python
Как ты можешь знать, uwsgidecorators
работают, только если ваше приложение работает в контексте uwsgi
, что не совсем понятно из документации: https://uwsgi-docs.readthedocs.io/en/latest/PythonDecorators.html
Мой код использует эти декораторы, например, для блокировки:
@uwsgidecorators.lock
def critical_func():
...
И это прекрасно работает при развертывании моего приложения с помощью uwsgi, однако при запуске его непосредственно из оболочки Python я получаю ожидаемую ошибку:
File ".../venv/lib/python3.6/site-packages/uwsgidecorators.py", line 10, in <module>
import uwsgi
ModuleNotFoundError: No module named 'uwsgi'
Есть ли какое-либо известное решение для запуска моего приложения в обоих режимах? Очевидно, мне не нужны синхронизация и другие возможности для работы при использовании простого интерпретатора, но выполнение некоторых попыток, за исключением импорта, кажется действительно плохим кодированием.
1 ответ
А пока я сделал следующую реализацию, был бы рад узнать, что есть что-то попроще:
class _dummy_lock():
"""Implement the uwsgi lock decorator without actually doing any locking"""
def __init__(self, f):
self.f = f
def __call__(self, *args, **kwargs):
return self.f(*args, **kwargs)
class uwsgi_lock():
"""
This is a lock decorator that wraps the uwsgi decorator to allow it to work outside of a uwsgi environment as well.
ONLY STATIC METHODS can be locked using this functionality
"""
def __init__(self, f):
try:
import uwsgidecorators
self.lock = uwsgidecorators.lock(f) # the real uwsgi lock class
except ModuleNotFoundError:
self.lock = _dummy_lock(f)
def __call__(self, *args, **kwargs):
return self.lock(*args, **kwargs)
@staticmethod
@uwsgi_lock
def critical_func():
...