Независимый процесс нереста колб (вилка) приводит к использованию порта - PullRequest
0 голосов
/ 11 декабря 2018

Я бы хотел, чтобы Flask вызывал независимый процесс C ++, и Flask должен продолжать работать.Он запускает процесс c ++, и если я убиваю Flask, он продолжает работать (хорошо).Моя проблема в том, что если я перезапущу Flask, он скажет, что используемый порт работает, и я не могу перезапустить.Так что, похоже, этот процесс все еще как-то связан с Flask.Как можно избежать этого?Спасибо

import os
pid=os.fork()
if pid==0: # new process
    os.system("nohup /path/myc++ &")

Запустить полностью независимый процесс

Ошибка:

sudo python server.py 
 * Serving Flask app "server" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
Traceback (most recent call last):
  File "server.py", line 1046, in <module>
    app.run(debug=True, use_reloader=True)
  File "/home/user/.local/lib/python2.7/site-packages/flask/app.py", line 943, in run
    run_simple(host, port, self, **options)
  File "/home/user/.local/lib/python2.7/site-packages/werkzeug/serving.py", line 795, in run_simple
    s.bind(get_sockaddr(hostname, port, address_family))
  File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use

1 Ответ

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

Это из-за того, что ваш дочерний процесс (myc ++) унаследовал все открытые дескрипторы файлов (включая сокет) от родительского (Flask) после вызова fork().Когда родительский процесс завершается, эти дескрипторы остаются в открытой статистике и при следующем запуске Flask не сможет связать сокет с уже открытым портом.

После разветвления в дочернем процессе дескрипторы родительского файладолжен быть закрыт перед запуском команды system().

Вы должны попробовать этот код:

    import os
    pid=os.fork()
    if pid==0: # new process
            for fd in xrange(0, 1024):
                try:
                    os.close(fd)
                except OSError:
                    pass
            os.system("nohup /path/myc++ &")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...