我正在Haskell中编写CGI脚本.当用户点击"提交"时,Haskell程序在服务器上运行,更新(即读入,处理,覆盖)状态文件.然后读取覆盖有时会导致延迟IO的问题,因为我们可能在读完输入之前生成一个大的输出前缀.更糟糕的是,用户有时会在提交按钮上弹跳,并且两个进程实例同时运行,争夺同一个文件!
什么是实施的好方法
transactionalUpdate :: FilePath -> (String -> String) -> IO ()
Run Code Online (Sandbox Code Playgroud)
函数('update')从旧文件内容中计算新文件内容的位置?假设"更新"是严格的是不安全的,但可以假设它是完全的(对部分更新功能的鲁棒性是一种奖励).可以同时尝试事务,但是如果文件是由其他人写入的,则没有事务应该能够更新.在竞争文件访问的情况下,事务可以中止.我们可以假设系统范围内唯一的临时文件名来源.
我当前的尝试写入临时文件,然后使用系统复制命令覆盖.这似乎解决了懒惰的IO问题,但它并没有让我对比赛安全.有没有经过试验和测试的配方,我们可以装瓶?
最常用的unixy方法是使用flock: