写在()与p.terminate终止的进程
问题描述:
终止我与子其中p.terminate
我开这样的SIGTERM日志文件:写在()与p.terminate终止的进程
p = Popen([sys.executable, args], stdin=PIPE, stdout=PIPE, stderr=open("error.txt", 'a'))
正如你可以看到我全部重定向错误一个文本等等我可以阅读它。 我missused此功能可以打印的东西到这个文件时,子被终止:
signal.signal(signal.SIGTERM, sigterm_handler) # sets shutdown_flag
while True:
if shutdown_flag:
print("Some Useful information", file=sys.stderr)
但是:文件总是空的。这是因为调用terminate
时管道被关闭,并且此时从子进程写入的任何内容都会丢失?还是有没有其他问题,我只是没有看到这里?
答
通常,终止线程并不是一个好主意。相反,你应该问它结束使用threading.Event。
event = threading.Event()
while not event.isSet(): # use this instead of while True:
# do your stuff
# now write your file
print("Some Useful information", file=sys.stderr)
然后,而不是p.terminate(),用途:
threading.Event().set()
我不使用线程,但子进程。它仍然以同样的方式工作吗? – Fuzzyma
我的不好。我的大脑上有线程。 你可以做的是类似的。也就是说,告诉流程退出而不是杀死它。我会推荐使用p.communicate(“请关闭”)代替p.terminate() 然后,我不会在我的原始代码片段中等待事件,而是在标准输入中查找我们的数据并查找“请关闭”(或任何你想要的字符串)。 此外,重要的是,在p.communicate()之后,执行p.wait()。 – Martin
这是不容易做到我的情况,因为我管道数据的过程。设置你的解决方案会混淆我想保持分离的数据流和控制流 – Fuzzyma