使用delegator.py包(用于Humans的子流程2.0),似乎is_alive
返回的Command
实例的run()
属性无法正常工作(正如我期望的那样)
如果我运行一个需要花费几秒钟才能完成的命令(例如play
命令),则在事物运行时,我可以检查is_alive
并返回True
。目前很好。如果我等待播放声音结束并再次检查,它仍然返回True
。相当奇怪,但是我要了解子流程什么。相反,如果我尝试使用kill()
停止声音,则声音会按预期停止,但是is_alive
仍然为true。
此外,我可以在同一子进程上多次运行kill()
,而不会引发异常。在我be_alive
之后,期望一个流程(子流程)不kill()
错了吗?
在某种程度上,我正在编写一个小型包装器类,该类在非阻塞模式下运行命令,如果suer在上一个命令仍在运行时尝试运行新命令,它将杀死第一个命令并运行新的。
from delegator import run
class ProcRunning:
'''A delegator subprocess with an extra layer to always run
non blocking mode and always run only one thing at a time.'''
def __init__(self):
self.subprocess = None
def run_new(self, command):
#Kill prevoius process, if needed
if not self.subprocess is None:
if self.is_alive:
self.kill()
self.subprocess = run(command, block=False)
用法示例
p = ProcRunning()
command = create_sound() #returns a string with a command to play a sound for a couple of seconds
p.run_new(command)
注意:对于这种特定用法,我知道is_alive
始终为true的事实意味着我可以省略它,但是我想在以后的代码中使用它,我不在这里发布。另外,我对为什么这样不起作用感到好奇。我确定它能按预期工作,只是我不理解它。