我想创建一个不断添加" test"的子进程(writer.py)。每秒到一个文件(' 20180309.txt')并使用另一个python进程(starter.py)维护子进程。
它运行正常,但令我困扰的一件事是the file object
在终止子进程之前没有关闭。我想知道当子进程收到terminate()信号时,是否有办法关闭文件对象,或者是否有其他方法可以解决这个问题。
#starter.py
import os
import sys
import subprocess
p1 = subprocess.Popen( ["d:\python36-32\python.exe", r"""writer.py"""], shell=False )
print(p1.pid)
try:
p1.communicate(timeout=5)
except subprocess.TimeoutExpired:
p1.terminate()
#writer.py
import time
from datetime import datetime
file = open( datetime.now().strftime('%Y-%m-%d') + '.txt', 'a')
while True:
file.write('test\n')
file.flush()
time.sleep(1)
答案 0 :(得分:1)
首先,任何现代操作系统都会关闭进程在其消失时打开的所有(非共享)文件。你不必担心这个。
在一个更复杂的应用程序中,您可能需要担心部分写入(或任何其他"事务的部分"无法原子地完成),但对于简单的情况,那里有&#39什么都不用担心。
同时,terminate
中的subprocess
方法不适用于礼貌关闭请求。如果您想关闭孩子,可以通过更好的方式向其发送消息。事实上,由于孩子和父母都是Python,你可能会更乐意使用multiprocessing
而不是subprocess
。
话虽如此,在* nix上,terminate
恰好发送SIGTERM
,SIGTERM
设计用于礼貌关闭。如果您真的想要处理这个 - 并且不关心Windows - 请阅读signal
库,了解如何为SIGTERM
编写信号处理程序。从信号处理程序中,您可以在下一次循环中设置全局"退出"变量。或者致电sys.exit
(我认为这会在顶级代码中引发异常,但不要引用我的内容)或其他任何你想要的内容。