ошибка многопроцессорного выполнения python 3.8 flask apache 2.4 wsgi: fork не поддерживается для субинтерпретаторов

#python-3.x #apache #flask #multiprocessing #mod-wsgi

#python-3.x #apache #фляжка #многопроцессорная обработка #мод-wsgi

Вопрос:

Я пытаюсь запустить код в Ubuntu 20.04 с python 3.8, flask, wsgi и использованием многопроцессорной обработки. Я написал код, который отлично работает с python. Это код:

     from flask import Flask
    from multiprocessing import Process, Manager

    def f(d, l):
        d[1] = '1'
        d['2'] = 2
        d[0.25] = None
        l.reverse()
    # Function to convert   
    def listToString(s):  
        
        # initialize an empty string 
        str1 = " " 
        res = str1.join(list(map(str,s)))
        # return string   
        return res 

    app = Flask(__name__)
    @app.route("/")
    def hello():
        with Manager() as manager:
            d = manager.dict()
            l = manager.list(range(10))

            p = Process(target=f, args=(d, l))
            p.start()
            p.join()

            print(d)
            print(l)    
            return "Hello world! "   listToString(d)
    if __name__ == "__main__":
        app.run()
  

Проблема в том, когда я пытаюсь запустить его с помощью apache 2.4 с модулем wsgi. Вот файлы .conf и .wsgi:

       <VirtualHost *:80>
           # Add machine's IP address (use ifconfig command)
           ServerName 192.168.0.7

           #Application Configuration. SetEnv command
           SetEnv wsgi.multithread True
           SetEnv wsgi.multiprocess True

           WSGIDaemonProcess testFlask processes=2 threads=15 python-path=/home/israel/server/study:/home/israel/server/env/lib/python3.8/site-packages
           # Give an alias to to start your website url with
           WSGIScriptAlias /testFlask /home/israel/server/study/my_flask_app.wsgi 
           WSGIProcessGroup testFlask

           <Directory /home/israel/server/study/>
                # set permissions as per apache2.conf file  
               <IfVersion < 2.4>
                   Order allow,deny
                   Allow from all
               </IfVersion>
               <IfVersion >= 2.4>
                   Require all granted
               </IfVersion>    
                Options FollowSymLinks
                AllowOverride None
           </Directory>
           ErrorLog ${APACHE_LOG_DIR}/test-error.log
           LogLevel info
           CustomLog ${APACHE_LOG_DIR}/test-access.log combined
      </VirtualHost>
  

и

     #! /usr/bin/python3.8

    python_home = '/home/israel/server/env'
    activate_this = python_home   '/bin/activate_this.py'
    print("activate dir", activate_this)
    #python 3.8
    exec(open(activate_this).read(), dict(__file__=activate_this))

    import logging
    import sys
    #checking version
    print('systems version {}.{}.{}'.format(sys.version_info[0], sys.version_info[1], sys.version_info[2]))

    sys.path.insert(0, '/home/israel/server/study/')
    from my_flask_app import app as application
    application.secret_key = 'anything you wish'
  

Я использую виртуальную среду. Через apache и wsgi код работает нормально, если я удаляю многопроцессорный код, а также строки:

       #Application Configuration. SetEnv command
      SetEnv wsgi.multithread True
      SetEnv wsgi.multiprocess True

      WSGIDaemonProcess testFlask processes=2 threads=15 python-path=/home/israel/Documents/Classlol/face_Glasses_Fitting_server-quis/study:/home/israel/Documents/Classlol/face_Glasses_Fitting_server-quis/env/lib/python3.8/site-packages
  

в файле .wsgi.

При запуске предыдущего кода я получаю сообщение об ошибке: RuntimeError: fork не поддерживается для субинтерпретаторов. Я прочитал документацию и ничего не нахожу. Я также проверяю ошибку python 3.8 bugzilla.redhat.com/show_bug.cgi?id=1745894 и, похоже, что это было решено… Прошла неделя, и я ничего не получил.. Есть идеи?

Ответ №1:

из https://github.com/GrahamDumpleton/mod_wsgi/issues/614#issuecomment-691565686

Python 3.8 начал вводить ограничения на то, что вы можете делать в субинтерпретаторах Python. Субинтерпретаторы Python вызывают различные другие проблемы со сторонними модулями Python, которые не предназначены для работы в субинтерпретаторах. По этой причине уже давно рекомендуется избегать их при использовании mod_wsgi.

Для этого убедитесь, что вы используете режим демона mod_wsgi, в котором только одно приложение WSGI делегировано любой группе процессов-демонов mod_wsgi. Затем принудительно используйте основной контекст интерпретатора Python для приложения WSGI.

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

За пределами виртуального хостинга. Это отключило встроенный режим, чтобы убедиться, что вы используете режим демона.

WSGIRestrictEmbedded на

Внутри VirtualHost (при условии, что вы их используете).

WSGIDaemon обрабатывает myapp WSGIScriptAlias / /some/path/myapp.py process-group=myapp application-group=%{GLOBAL}