繁体   English   中英

如何在终止子进程之前关闭子进程中的文件?

[英]How to close a file in a subprocess before terminating the subprocess?

我想制作一个子进程(writer.py),该子进程不断每秒向文件('20180309.txt')添加“测试”,并使用另一个python进程(starter.py)维护该子进程。

它工作正常,但令我困扰的一件事是在终止子进程之前未关闭the file object 我想知道子进程收到终止信号时是否有关闭文件对象的方法,或者是否有其他方法可以解决此问题。

#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)

首先,任何新式操作系统都会在进程关闭时关闭其打开的所有(非共享)文件。 您不必为此担心。

在更复杂的应用程序中,您可能要担心部分写入(或原子不能完成的任何其他“事务”的一部分),但是对于简单的情况,根本无需担心。

同时, subprocessterminate方法并不适用于礼貌的关机请求。 如果要关闭孩子,则有更好的方法向它发送消息。 实际上,由于子代和父代都是Python,因此使用multiprocessing而不是首先使用subprocess multiprocessing可能会更快乐。

就是说,在* nix上, terminate发生发送SIGTERM ,并且SIGTERM 专为礼让关机而设计的。 如果您真的想处理这个问题(而不关心Windows),请阅读signal库,了解如何为SIGTERM编写信号处理程序。 在信号处理程序中,您可以设置全局“下次通过循环退出”变量。 或致电sys.exit (我认为这会在顶级代码中引发异常,但不要在sys.exit我),或其他任何您想要的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM