何时使用阻止和非阻塞功能?

时间:2014-12-23 04:28:17

标签: python linux terminal bsd

我正在制作一个python模块来帮助管理Linux(和BSD)中的一些任务 - 即管理Linux容器。我知道从python运行终端命令的几种方法,例如 Popen() call() check_call() 。我应该何时使用这些特定功能?更具体地说,何时使用阻止或非阻塞功能

我有构建要运行的命令的函数,然后使用Popen将命令(列表)传递给另一个函数来执行它。

传递如下命令:

['lxc-start', '-n', 'myContainer']

...
def executeCommand(command, blocking=False):
    try:
        if blocking:
            subprocess.check_call(command)
        else:
            (stdout, stderr) = Popen(command, stdout=PIPE).communicate()
            self.logSelf(stdout)
    except:
        as_string = ' '.join(command)
        logSelf("Could not execute :", as_string) #logging function
    return
...

代码默认使用 Popen(),这是一个非阻塞函数。我应该在哪种情况下覆盖阻止并让函数执行 check_call()

我最初的想法是在进程是一次性临时进程(例如创建容器)时使用阻塞,并在进程持续运行时使用非阻塞,例如启动容器。

我是否正确理解了这些功能的用途?

1 个答案:

答案 0 :(得分:1)

要回答更广泛的问题 - 我建议:

当您执行以下操作时使用阻止呼叫:

  1. 你知道,无论是否有效,你都会很快。
  2. 对您的应用程序至关重要的东西,除非并且直到该任务完成,例如连接或创建关键资源,否则对您的应用程序执行任何其他操作毫无意义。
  3. 如果可以,请在所有其他情况下使用非阻止呼叫,尤其是:

    1. 任务可能需要一段时间或
    2. 在执行任务时做一些其他事情会很有用(即使这是一个显示进度的gui更新)。