python-3.x - Python 应用程序不会快速释放文件处理程序
问题描述
def write_data_to_disk(file_list):
for file_name in file_list: # size of file_list is around 20K
with open(file_name, 'a') as f:
f.write(...)
...
该应用程序有一个名为 as 的函数,write_data_to_disk
它将文件名列表作为输入,并将一些增量数据写入每个文件。该函数将被应用程序重复调用。
如果我运行这个应用程序的多个实例,每个实例都给定唯一的文件名列表,系统就会遇到问题。根据我的初步调查,似乎所有启动的应用程序都用尽了操作系统中所有可用的文件处理程序,并导致其他正在运行的进程失败。如您所见,在每个单独的应用程序中,它只打开一个要写入的文件,然后立即关闭它并准备下一次写入。根据我的测试结果,如果我同时运行该应用程序的六个或八个实例,我会遇到问题。以前有没有人有类似的经验,解决这个问题的正确解决方案是什么?
谢谢
解决方案
这是我在显式控制文件句柄下的意思:
import os
def write_data_to_disk(file_list):
for file_name in file_list:
with open(file_name, 'a') as f:
f.write(...)
f.flush() # force the buffer flush
os.fsync(f.fileno()) # force the OS buffer sync (disk write in most cases)
# let __exit__() close the handler; an explicit f.close() might be faster, tho
如果这不能更快地释放您的句柄,您将不得不完全深入研究文件描述符操作并控制整个过程,而不是让 Python 在后台为您完成。
推荐阅读
- php - 如何在请求验证后使用 Laravel 在下拉列表中显示选定的值?
- facebook - Facebook API 评论数
- c# - 使用 TaskCompletionSource 将库转换为可等待的库?
- swift - 如何修复 View SwiftUi 半关闭的 bug
- opencv - 我可以使用什么 OpenCV 方法对 Windows 照片中的 Napa 过滤器等图像进行去噪?
- javascript - React JS 映射/显示元素
- ajax - 从请求中获取ajax数组并在laravel中显示
- mysql - SQL 查询以显示具有部门名称和负责人姓名的员工列表
- c++ - 移动类的成员作为 const 引用参数传递
- cassandra - Cassandra where 子句作为元组