【问题标题】:Polling a subprocess using pid [closed]使用 pid 轮询子进程 [关闭]
【发布时间】:2016-06-29 08:57:56
【问题描述】:

我有一个 django 项目,其中允许用户一次启动多个子进程。这些过程可能需要一些时间,因此用户可以继续使用应用程序的其他方面。在任何情况下,用户都可以查看所有正在运行的进程并轮询其中任何一个以检查其是否结束。为此,我需要使用它的 pid 轮询进程。 Popen.poll() 需要一个 subprocess.Peopen 对象,而我所拥有的只是该对象的 pid。我怎样才能得到想要的结果?

在models.py中:

class Runningprocess(models.Model):
    #some other fields
    p_id=models.CharField(max_length=500)
    def __str__(self):
        return self.field1

在views.py中:

def run_process():
    ....
    p= subprocess.Popen(cmd, shell =True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    new_p=Runningprocess()  
    new_p.p_id=p.pid
    ....
    new_p.save()
    return HttpResponseRedirect('/home/')   

def check(request,pid):
    #here i want to be able to poll the subprocess using the p_id e.g something like:
     checkp = pid.poll() #this statement is wrong
     if checkp is None:
           do something
     else:
           do something else

我只需要一个有效的语句而不是 'checkp = pid.poll()'

【问题讨论】:

  • 您能否显示MCVE 以重现该问题。
  • 查看已编辑的问题
  • 不建议在您的特定情况下这是一个好主意,但要检查具有特定 PID 的进程是否正在运行,您可以使用os.kill(pid, 0),如果没有具有该 PID 的进程,则会引发OSError正在运行。

标签: python django subprocess


【解决方案1】:

不要使用 PID 轮询

PID 是分配给进程的临时 ID。只要进程正在运行,它就会与进程保持一致。当一个进程终止或被杀死时,它的 PID 可能(或可能不会立即)分配给其他进程。因此,现在有效的进程 PID 可能在一段时间后不再有效。

现在,如何轮询进程?

这是我在我的一个项目中所做的:

psub = subprocess.Popen(something)
# polling

while psub.poll() is None:
    pass

但请注意,上述代码可能会导致死锁。为避免死锁,您可以使用两种方法:

  1. 使用计数器。当计数器值大于某个固定值时 - 终止进程。

2.使用超时。获取进程开始的开始时间以及进程花费的时间超过固定时间的时间 - kill。

start_time = time.time()
timeout = 60 # 60 seconds
while psub.poll() is None:
    if time.time() - start_tym >= int(timeout):
        psub.kill()

【讨论】:

  • 问题是用户可以从webapp的不同位置多次访问视图'run_process()',因此启动了不同的进程。在特定的 url,我列出了当前保存在 Runningprocesses 模型中的所有进程,单击其中任何一个都会将用户重定向到“检查”,我需要检查该特定进程是否仍在处理中。如果它完成了,我希望某些事情随着它从该模型中被删除而发生。
  • @Code_aholic AFAIK,PID 不可靠。你可以为你的情况做的是。在异步 Popen() 进程中继续运行run_process() 的控制器。现在将进程 PID 存储在 DB 中,让启动的进程为每个阶段(如“init”、“killed”、“complete”)写入 DB。每当 webapp 用户点击数据库中的 PID 显示数据时。
  • 哦,好吧,我认为值得一试。我应该这么想的!谢谢 :)。虽然我有一个担忧,但这个过程也可能需要几个小时,所以这种方法在这种情况下可以正常工作吗?
  • 如果有帮助,您可以通过接受答案来结束问题。
  • 这个过程也可能需要几个小时,那么这种方法在这种情况下可以正常工作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多