fork进程读取文件需要注意什么?
What do I need to be concerned with when forking a process and reading files?
我对分叉还很陌生,我有超过 10,000 个文件存储在一个文件夹中,我正在通过执行以下操作阅读这些文件:
#loop over all xFiles in a list of files
try:
f = open(xFile, 'r', encoding="utf8")
#search through file for terms
#do other stuff
except:
#Someone removed the file cannot be found.
print("\tFile no longer exists:", xFile)
f.close()
因为我的脚本运行大约需要 45 分钟,并且由于我正在处理的项目的性质,我正在搜索的文件列表中的文件有时可能会移动或很常见删除。这就是为什么我的阅读包含在 try 语句中。
在插入以下注释 "search through file for terms" 的位置,我正在对数千种模式运行算法。我希望在循环之前分叉我的进程,以便我有两个具有不同模式集(不同大小)的进程搜索(或读取)相同的文件列表。
我的一些担忧:
- 如果一个进程正在读取一个文件,而它的子进程试图读取该文件,则会执行 except 并且永远不会针对该特定文件执行搜索算法。
- 我将无法通过两个进程同时读取同一个文件。
所以这是我在提供上下文后的问题,当分叉一个进程并在两个进程之间读取相同的文件时我需要关注什么?
我假设是一个 *nix 类型的系统。
当你 fork 一个进程时,文件描述符可以被两者访问。这意味着两个进程正在访问单个内核数据。这在你的情况下很糟糕。您可能希望在分叉 之后 打开文件,这样每个进程都有自己的文件访问权限(和偏移量)。
通常在子进程更改权限(例如 Web 服务器)时,您会希望在 分叉之前 打开文件描述符。父进程以 root 用户身份在端口 80 上打开一个套接字,然后派生一个子进程,该子进程将侦听指向打开的 80 端口的文件描述符。然后子进程可以下降到普通用户(不是 root)和继续接受新连接。
希望对您有所帮助!
我对分叉还很陌生,我有超过 10,000 个文件存储在一个文件夹中,我正在通过执行以下操作阅读这些文件:
#loop over all xFiles in a list of files
try:
f = open(xFile, 'r', encoding="utf8")
#search through file for terms
#do other stuff
except:
#Someone removed the file cannot be found.
print("\tFile no longer exists:", xFile)
f.close()
因为我的脚本运行大约需要 45 分钟,并且由于我正在处理的项目的性质,我正在搜索的文件列表中的文件有时可能会移动或很常见删除。这就是为什么我的阅读包含在 try 语句中。
在插入以下注释 "search through file for terms" 的位置,我正在对数千种模式运行算法。我希望在循环之前分叉我的进程,以便我有两个具有不同模式集(不同大小)的进程搜索(或读取)相同的文件列表。
我的一些担忧:
- 如果一个进程正在读取一个文件,而它的子进程试图读取该文件,则会执行 except 并且永远不会针对该特定文件执行搜索算法。
- 我将无法通过两个进程同时读取同一个文件。
所以这是我在提供上下文后的问题,当分叉一个进程并在两个进程之间读取相同的文件时我需要关注什么?
我假设是一个 *nix 类型的系统。
当你 fork 一个进程时,文件描述符可以被两者访问。这意味着两个进程正在访问单个内核数据。这在你的情况下很糟糕。您可能希望在分叉 之后 打开文件,这样每个进程都有自己的文件访问权限(和偏移量)。
通常在子进程更改权限(例如 Web 服务器)时,您会希望在 分叉之前 打开文件描述符。父进程以 root 用户身份在端口 80 上打开一个套接字,然后派生一个子进程,该子进程将侦听指向打开的 80 端口的文件描述符。然后子进程可以下降到普通用户(不是 root)和继续接受新连接。
希望对您有所帮助!