首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Popen磁盘写缓存

Popen磁盘写缓存
EN

Stack Overflow用户
提问于 2014-08-05 16:56:32
回答 2查看 386关注 0票数 0

我有一个关于python和磁盘写的新手问题。基本上,我正在按顺序执行一些popen进程,其中第二个进程将第一个进程的输出作为其输入文件。例如:

代码语言:javascript
运行
复制
p = subprocess.Popen(["mysqldump", "--single-transaction", "-u",
    database_username, "--password="+database_password, "--databases",
    "--host", server_address, database_name, ],
    stdout = open( outputfile, 'w') , stderr=subprocess.PIPE)
error = p.stderr.read()

然后

代码语言:javascript
运行
复制
p2 = subprocess.Popen(["tar", "-C", backup_destination,
    "--remove-files", "--force-local", "-czf", gzipoutputfile,
    mysqlfilename ], stderr=subprocess.PIPE)
error2 = p2.stderr.read()

这通常完成良好的顺序,没有任何问题。注意,第二个进程从第一个进程生成的文件中读取。每隔一段时间,我就会在第二个子进程上看到一个错误,即"tar: host-ucpsom_2012-2014-08-05-0513. error : file在我们读取时更改“。

我假设这是因为有一些缓存的磁盘写入来自第一个进程,并且文件实际上是在第一个进程实际终止并且不再在内存中被写入磁盘之后完成的。

所以,我的问题是:在实际读取此文件之前,是否有一种优雅的方法等待缓存的磁盘写入完成?我认为有一件事是读取磁盘上文件的大小,等待几秒钟,然后再检查文件的大小,如果它们是相同的,那么假设它们正在编写,但我认为必须有一个更优雅的方法来解决这个问题。有谁能在这方面提出建议?谢谢你抽出时间回答我的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-05 19:01:25

调用p.wait() (或另一个间接等待退出的调用,如communicate()),然后调用p2

只调用p.stderr.read(),等待p关闭其stderr通道;但是,程序可以在关闭其余的文件描述符之前关闭stderr (对于每个单独的文件句柄,触发刷新到VFS层的步骤)并退出。

如果您的文件系统是Linux上的NFS,请确保正在使用sync标志(与w/默认async相反),以便在本地端继续运行之前在远程端完成操作。

票数 2
EN

Stack Overflow用户

发布于 2014-08-05 17:01:36

尝试使用文件阻塞标志。一旦关闭第一个进程释放标志文件,这将是第一个进程的工作已经完成的标志。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25144336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档