python - 子进程如何处理文件指针?
问题描述
假设 Python 中的代码框架如下所示。此代码正在调用另一个可执行的 bash 脚本以在 Ubuntu 18.04 上并行运行。
#!/usr/bin/env python3
#encoding:utf-8
import subprocess
with open(file='subprocess_output.log', mode='a') as file_pointer:
subprocess.Popen(args=['./subprocess.bash'], stdout=file_pointer, stderr=file_pointer)
#Next section
这是工作。但我很好奇,with
一旦主代码进入下一部分,语句是否正在关闭文件指针并释放资源。这不正是with
声明应该做的吗?安全地获取和释放资源?但是,如果日志文件的句柄在调用后立即释放,那么当主脚本继续前进时,子进程缓冲区如何稍后写入日志?
对于任何深入了解操作系统如何在较低级别处理文件的人来说,答案可能是显而易见的。因此,任何指向在线资源(双关语)的指针都会很棒。
解决方案
每个进程都有自己的一组打开文件。子进程是使用其父进程的打开文件句柄(Unix 中的“描述符”,子进程由flag控制的子集)的副本(子集)创建的。立即关闭父母的句柄,但这根本不会影响孩子。FD_CLOEXEC
with
有时是否保留任何副本很重要:例如,当写入端的每个副本都已关闭时,从管道读取会产生 EOF。
推荐阅读
- postgresql - 从 PostGiS 中的同一表的文本字段创建多边形几何
- node.js - Heroku redis 远程连接
- regex - 你如何匹配模式跳过异常?
- mongoose - Mongoose 可以直接填充字段而不是嵌套在对象中吗?
- function - Woocommerce 订阅从 functions.php 更新下一个付款日期
- r - 按 Shiny 中的 rownames 列排序数据表
- javascript - 在 Google App Script 中使用 .splice() 时出现问题
- ansible - Ansible:合并2个哈希列表,按键组合
- clojure - 设置 leiningen 配置文件以在环境和多个电源之间多路复用
- sql - How to compare trimmed variable in SQL statement?