【发布时间】:2016-08-11 10:41:00
【问题描述】:
我有一个 Python2.7 脚本,它做了一些并行魔法,最后进入 Flask gui_loop。在某些时候,一个线程使用 subprocess.Popen 创建一个后台进程。这行得通。
当我的脚本退出并且子进程仍在运行时,我无法再次运行我的脚本,因为 flask gui_loop 失败:
socket.error: [Errno 98] Address already in use
使用 netstat -peanut 我可以看到当 python 脚本退出时套接字的所有权转移到子进程。这是 python 脚本和子进程都运行时的样子:
root@test:/tmp# netstat -peanut | grep 5000
tcp 0 0 127.0.0.1:5000 0.0.0.0:* LISTEN 1000 840210 21458/python
终止 Python 脚本后,socket 并没有关闭,而是将其所有权传递给子进程:
root@test:~/PycharmProjects/foo/gui# netstat -peanut | grep 5000
tcp 0 0 127.0.0.1:5000 0.0.0.0:* LISTEN 1000 763103 19559/my-subprocess
有没有办法解决这个问题?子进程(用 C 编写)在该套接字上没有做任何事情,也不需要它。我可以在不将 gui 循环套接字资源传递给它的情况下以某种方式创建子进程吗?
我当然可以终止进程,但这并不理想,因为这样做的目的是围绕一些计算构建一个简单的 gui,并且在 gui 脚本退出时不会丢失进度。如果我能让 gui 脚本重新启动并运行,我将有一种机制来重新连接到子进程。
R
【问题讨论】:
-
我得到了与 Python 2.7 完全相同的东西,用于在 Django 服务器中启动一个守护程序,它在 Python 3.7 中运行良好。当 Django 服务器退出时,守护程序继续持有 Django 服务器端口。接受的答案解决了这类问题。
标签: python python-2.7 sockets subprocess