在Windows 7平台上,我使用python 3.6作为框架来启动工作流程(用C语言编写)。
为了启动流程,使用了subprocess.Popen
。以下显示了相关代码(每个进程要启动一个线程)。
redirstream = open(redirfilename, "w")
proc = subprocess.Popen(batchargs, shell=False, stdout=redirstream)
outs, errs = proc.communicate(timeout=60)
# wait for job to be finished
ret = proc.wait()
...
if ret == 0: # changed !!
redirstream.flush()
redirstream.close()
os.remove(redirfilename)
communicate
用于能够在60秒后终止可执行文件,以防止它挂起。 redirstream
用于将可执行文件(用C编写)的输出写入文件,用于一般调试目的(与此问题无关)。当然,所有进程都以redirfiles
传递不同的文件名。
从独立的python线程以这种方式启动多达十个这样的子进程。
虽然它有效但我做了一个神秘的观察:
对于可执行文件已完成且没有错误的情况,我想删除redirfilename
,因为它已不再使用。
现在让我们说,我已经启动了流程-A,B和C.
进程A和B完成并返回0作为结果。
然而,进程C故意不获取数据(仅用于测试,串行连接已断开)并使用Windows ReadFile
函数等待来自命名管道(从python创建)的输入:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx
在这种情况下,当“C”仍在等待ReadFile
完成时,A和B的os.remove(redirfilename)有时会抛出异常“PermissionError
”,说,该文件仍然被另一个进程使用。但是从任务管理器我可以看到,进程A和B不再存在(正如预期的那样)。
我试图抓住PermissionError
并在延迟一段时间后重复删除命令。只有在“C”终止后(60秒后超时),才能删除A或B的redirfile。
为什么redirstream
仍然被屏蔽并以某种方式使用,虽然后面的进程不再存在,为什么它在一个完全不相关的进程中被ReadFile()
阻止,绝对不是相关到该特定文件?这是Python或我的实现中的问题吗?
任何提示都受到高度赞赏......