在Windows7平台上,我使用Python3.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
。你知道吗
最多有10个这样的子进程以这种方式从独立的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
完成时,os.删除(redirfilename)for A和B有时抛出异常“PermissionError
”,即文件仍由另一个进程使用。但是从taskmanager我可以看到,进程A和B已经不存在了(正如预期的那样)。你知道吗
我试图捕获PermissionError
,并在延迟一段时间后重复delete命令。只有在“C”终止后(60秒后超时),才能删除A或B的重拨文件。你知道吗
为什么redirstream
仍然被阻止并以某种方式被使用,尽管后面的进程不再是活动的,为什么它被ReadFile()
在一个完全不相关的进程中阻止,而这个进程肯定与特定的文件不相关?这是Python中的问题还是我的实现中的问题?你知道吗
任何提示都非常感谢。。。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐