Запуск приложения uWSGI, которое напрямую использует uwsgidecorators из оболочки python - PullRequest
0 голосов
/ 03 декабря 2018

Как вы, возможно, знаете, 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 Ответ

0 голосов
/ 03 декабря 2018

А пока я реализовал следующую реализацию, был бы рад узнать, что есть что-то попроще:

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():
  ...
...