烧瓶产卵独立过程(叉)导致使用端口

时间:2018-12-11 09:41:55

标签: python c++ flask fork

我想让Flask调用一个独立的C ++进程,并且Flask应该继续运行。 它启动了c ++进程,如果我杀死Flask,它将继续运行(良好)。 我的问题是,如果我重新启动Flask,它将说正在使用的端口正在运行,而我无法重新启动。因此,似乎该过程仍以某种方式与Flask有关。如何避免这种情况? 谢谢

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

Launch a completely independent process

错误:

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 :(得分:0)

这是因为您的子进程(myc ++)在fork()调用之后从父级(Flask)继承了所有文件打开的描述符(包括套接字)。当父进程退出时,这些描述符保留在打开的统计信息中,并且在下次启动时,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++ &")