Javascript 文件系统读/写:这是竞争条件吗?

Javascript 文件系统读/写:这是竞争条件吗?,javascript,node.js,Javascript,Node.js,是否保证读取将在appendFile写入文件系统之前完成,或者我的数据可能在readFile完成之前被追加,从而readFile返回我新追加的数据?通过快速测试尝试这一点,它确实不稳定: 那么你做了什么find@epascarello很抱歉我的问题是,这是否是一个比赛条件,我希望从专家那里得到一些意见。从本质上讲,很难找到竞争条件,我不一定能够通过运行此代码来观察竞争条件。文件系统操作应该按顺序进行,我认为底层系统调用也将按相同的顺序进行。我还认为,由于权限的原因(每个访问使用不同的权限),节点

是否保证读取将在
appendFile
写入文件系统之前完成,或者我的数据可能在
readFile
完成之前被追加,从而
readFile
返回我新追加的数据?

通过快速测试尝试这一点,它确实不稳定:


那么你做了什么find@epascarello很抱歉我的问题是,这是否是一个比赛条件,我希望从专家那里得到一些意见。从本质上讲,很难找到竞争条件,我不一定能够通过运行此代码来观察竞争条件。文件系统操作应该按顺序进行,我认为底层系统调用也将按相同的顺序进行。我还认为,由于权限的原因(每个访问使用不同的权限),节点必须独立地分配文件句柄。所以比赛不应该发生。谢谢@Catalyst。这里正好是这样,因为读和写都在同一个文件上运行,对吗?或者两次读取两个不同的文件也是如此?我自己回答:读取两个不同的文件是不稳定的,而且确实存在竞争条件。演示:
import {appendFile, readFile} from 'fs'

// Read data from an Apache server's access log
readFile(
  '/var/log/apache2/access_log',
  {encoding: 'utf8'},
  (error, data) => {
    if (error) {
      console.error('error reading!', error)
      return
    }
    console.info('success reading!', data)
  }
)

// Concurrently, write data to the same access log
appendFile(
  '/var/log/apache2/access_log',
  'New access log entry',
  error => {
    if (error) {
      console.error('error writing!', error)
    }
  })