如何启动一个不阻塞套接字的python后台进程

时间:2014-07-19 20:15:33

标签: python sockets subprocess

我有一个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的返回值分配给任何内容,则不会阻止。但是如果我没有分配返回值,我就不能写入stdin。

1 个答案:

答案 0 :(得分:2)

来自文档:

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().