python - 何时使用阻塞和非阻塞函数?

标签 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. 你知道总是很快 - 无论它是否有效。
  2. 对您的应用程序至关重要的事情,以及除非并直到该任务完成,否则您的应用程序在哪些地方做任何其他事情都没有意义 - 例如连接或创建关键资源。

如果可以的话,在所有其他情况下使用非阻塞调用,尤其是在以下情况下:

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

关于python - 何时使用阻塞和非阻塞函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27614090/

相关文章:

java运行包括来自终端的类路径

python & c-c++ 单元程序导致段

python - 将包含十六进制和 ASCII 的字符串解码为十进制

python - 自动简化/重构 Python 代码(例如 for 循环 -> 列表理解)?

linux - linux下pthread优先级和lwp优先级有什么关系?

python - 在使用 Python 2.7 multiprocessing.Process 和日志记录的 Linux 上,日志记录如何/为什么是顺序的?

python - pandas 将重复项附加为列

无法理解为什么这会导致错误

c - 执行C程序时如何传递文件名

python - 如何在终端中动态打印字符串表?