【问题标题】:How to start a python background process which doesn't block a socket如何启动不阻塞套接字的python后台进程
【发布时间】:2014-07-20 04:27:58
【问题描述】:

我有一个 Python 程序,它接受套接字上的连接,读取命令,然后在某些情况下在关闭套接字之前启动后台子进程。

问题是,在子进程运行时,我似乎无法真正关闭套接字。

conn, addr = socket.accept()
...
p = Popen([cmd,user], stdin=PIPE)
print "debug1"                         
# the following call doesn't even return until sub-process is exited
#p.communicate(input=text)[0]  
p.stdin.write(text)
print "debug2"
conn.close()

我看到“debug2”立即打印出来,但在客户端,连接不会关闭,直到子进程终止。如果子进程需要一段时间才能完成,这是一个问题,因为连接应该立即终止。

更新:我刚刚读到“运行后台进程的关键不是创建取决于进程结果的操作。”我不依赖于过程的结果,但我确实需要发送到它的标准输入。但是,如果我删除对p.stdin.write 的调用,套接字仍然被阻塞。但是,如果我没有将Popen 的返回值分配给任何东西,它不会 阻塞。但是如果我不分配返回值,我就无法写入标准输入。

【问题讨论】:

    标签: python sockets subprocess


    【解决方案1】:

    来自文档:

    close() releases the resource associated with a connection but does not necessarily
    close the connection immediately. If you want to close the connection in a timely
    fashion, call shutdown() before close().
    

    【讨论】:

    • 那行得通...我猜我的另一个更新的观察结果是错误的。谢谢!
    • 为了记录,发生的事情是子进程继承了套接字文件描述符的副本。如果没有调用shutdown(),套接字实际上不会被关闭,直到所有指向套接字的文件描述符都被close()'d。由于在这种情况下子进程是一些通过 popen() 运行的不相关程序,因此子进程几乎肯定不会在继承的文件描述符上调用 close()(因为它不知道它存在),所以继承的文件描述符(因此 TCP 连接)保持打开状态,直到子进程退出并被清理。
    猜你喜欢
    • 2015-11-18
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2022-01-16
    • 2010-10-31
    • 2013-10-15
    相关资源
    最近更新 更多