Popen磁盘写缓存

时间:2014-08-05 16:56:33

标签: python

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

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()

然后

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.mysql:文件在我们读取时发生了变化”。

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

所以,我的问题是;是否有一种优雅的方式等待缓存磁盘写入在实际读取此文件之前完成?我想到的一件事是读取磁盘上文件的大小,等待几秒钟,然后再次检查文件的大小,然后如果它们是相同的假设它已经完成了写,但我觉得必须有一种更优雅的方式来解决这个问题。有人能在这方面提出建议吗?感谢您抽出宝贵时间回答我的问题。

2 个答案:

答案 0 :(得分:2)

在调用p.wait()之前调用communicate()(或其他间接等待退出的调用,例如p2)。

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

如果您的文件系统是Linux上的NFS,请确保sync标志正在使用(与默认async对比),以便在本地端之前在远程端完成操作前进。

答案 1 :(得分:0)

尝试使用文件阻止标志。关闭第一个进程以释放标志文件后,它将表明第一个进程的工作已完成。