Запуск приложения 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():
  ...
Другие вопросы по тегам