【问题标题】:Python subprocess.Popen() - subprocess causes sockets to remain openPython subprocess.Popen() - 子进程导致套接字保持打开状态
【发布时间】: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


【解决方案1】:

您应该在创建子进程时使用close_fds=True,这将导致所有文件描述符(以及打开的套接字)在子进程中关闭(stdin/stdout/stderr 除外)。

在较新的版本(python 3.2+)中,close_fds 已经默认为True,因为在大多数情况下,您不想在子进程中继承所有打开的文件描述符,但在 python2.7 中,您仍然需要明确指定。

【讨论】:

    【解决方案2】:

    您可以尝试使用 with 语句。这里有一些文档:

    http://preshing.com/20110920/the-python-with-statement-by-example/
    https://www.python.org/dev/peps/pep-0343/
    

    这会为您打开/关闭清理。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 2013-11-14
      • 2011-06-19
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 2017-06-02
      相关资源
      最近更新 更多