我正在制作一个 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()?
我最初的想法是当进程是一次性临时进程时使用阻塞,例如容器的创建,当进程持续运行时使用非阻塞,例如启动容器。
我是否正确理解了这些函数的用途?
最佳答案
为了回答更广泛的问题 - 我建议:
当你正在做以下事情时使用阻塞调用:
- 你知道总是很快 - 无论它是否有效。
- 对您的应用程序至关重要的事情,以及除非并直到该任务完成,否则您的应用程序在哪些地方做任何其他事情都没有意义 - 例如连接或创建关键资源。
如果可以的话,在所有其他情况下使用非阻塞调用,尤其是在以下情况下:
- 任务可能需要一段时间或
- 在任务执行时做其他事情会很有用(即使这是显示进度的 gui 更新)。
关于python - 何时使用阻塞和非阻塞函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27614090/