我可以在Python中异步删除文件吗?

富有的

我有一个运行很长时间的python脚本,它会创建和删除临时文件。我注意到在文件删除上花费了很短的时间,但是删除这些文件的唯一目的是确保该程序最终不会在长期运行时填满所有磁盘空间。Python中是否存在跨平台机制来异步删除文件,以便在操作系统负责文件删除的同时主线程可以继续工作?

马克西姆·埃格鲁什金

您可以尝试将删除文件委托给另一个线程或进程。

使用新产生的线程:

thread.start_new_thread(os.remove, filename)

或者,使用一个过程:

# create the process pool once
process_pool = multiprocessing.Pool(1)
results = []

# later on removing a file in async fashion
# note: need to hold on to the async result till it has completed
results.append(process_pool.apply_async(os.remove, filename), callback=lambda result: results.remove(result))

进程版本可能允许更多的并行性,因为众所周知的全局解释器锁导致Python线程无法并行执行我希望GIL在调用任何阻塞的内核函数(例如)时被释放unlink(),以便Python让另一个线程取得进展。换句话说,调用后台工作线程os.unlink()可能是最好的解决方案,请参见Tim Peters的答案

但是,multiprocessing正在使用下面的Python线程与池中的进程进行异步通信,因此需要进行一些基准测试来确定哪个版本提供了更多的并行性。

避免使用Python线程但需要更多编码的另一种方法是生成另一个进程,并通过管道将文件名发送到其标准输入。这样,您可以交易os.remove()到同步os.write()(一个write()系统调用)。可以使用不推荐os.popen()使用的方法来完成操作,并且此功能的使用非常安全,因为它仅在一个方向上与子进程进行通信。一个可行的原型:

#!/usr/bin/python

from __future__ import print_function
import os, sys

def remover():
    for line in sys.stdin:
        filename = line.strip()
        try:
            os.remove(filename)
        except Exception: # ignore errors
            pass

def main():
    if len(sys.argv) == 2 and sys.argv[1] == '--remover-process':
        return remover()

    remover_process = os.popen(sys.argv[0] + ' --remover-process', 'w')
    def remove_file(filename):
        print(filename, file=remover_process)
        remover_process.flush()

    for file in sys.argv[1:]:
        remove_file(file)

if __name__ == "__main__":
    main()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以在 deno 中多次异步写入文件吗?

我可以删除迁移目录中的django迁移文件吗

我可以通过 API 删除 Acumatica 中的文件吗?

我可以在python中删除从(到)开始的字符吗

我可以删除日志文件吗?

我可以删除.hgtags文件吗?

我可以阻止自己删除文件吗?

我可以删除Ktorrent * .dnd文件吗?

我可以使用Python configparser删除config.ini文件中某个部分的特定值吗?

我可以从.bat文件在arcpy中运行python脚本吗?

我可以将文件视为python中的列表吗?

我可以删除awk中的字段吗?

我可以从Debian中删除GUI吗?

我可以在反应中删除道具吗

我可以从maildir cur文件夹中删除或移动邮件文件吗?

我可以选择性地删除.cabal文件中的`ghc-options'特定文件吗?

iso文件可以从liveusb中删除吗?

我可以在异步函数中引发错误吗?

我可以在MVC Core中阻止异步代码吗?

asyncio:我可以在异步中包装同步 REST 调用吗?

如果我从zip文件中删除了某些内容,仍然可以恢复吗?

我可以从解决方案文件夹中删除NuGet.exe吗

我可以在Visual Studio的剃刀文件中删除“突出显示”吗?

我可以从* vc-dir *缓冲区中删除文件吗?

我可以从Windows 10文件浏览器中删除这些图标吗

可以删除我的Eclipse工作区中的.metadata文件夹吗?

我可以在git中检索已创建,暂存,从未提交但已删除的文件吗?

我可以从沙盒Mac应用程序中删除桌面上的文件吗?

我可以安全地删除Wikitude中的Samples文件夹吗?