我可以在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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

我可以删除.hgtags文件吗?

来自分类Dev

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

来自分类Dev

我可以删除日志文件吗?

来自分类Dev

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

来自分类Dev

我可以删除我的Assembla帐户中的文件夹和文件吗?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

我可以从Debian中删除GUI吗?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

我可以在cloud9-ide中还原已删除的文件吗?

来自分类Dev

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

来自分类Dev

Docker中的核心文件是什么,我可以将其删除吗?

来自分类Dev

我可以在Flutter中删除android和ios文件夹吗?

来自分类Dev

如果我不删除下载到Lambda函数的/ tmp目录中的文件,可以吗

来自分类Dev

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

来自分类Dev

我可以删除/ var / log / journal和/ var / cache / abrt-di / usr中的文件吗?

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

    我可以删除.hgtags文件吗?

  6. 6

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

  7. 7

    我可以删除日志文件吗?

  8. 8

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

  9. 9

    我可以删除我的Assembla帐户中的文件夹和文件吗?

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

    我可以从Debian中删除GUI吗?

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

    我可以在cloud9-ide中还原已删除的文件吗?

  23. 23

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

  24. 24

    Docker中的核心文件是什么,我可以将其删除吗?

  25. 25

    我可以在Flutter中删除android和ios文件夹吗?

  26. 26

    如果我不删除下载到Lambda函数的/ tmp目录中的文件,可以吗

  27. 27

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

  28. 28

    我可以删除/ var / log / journal和/ var / cache / abrt-di / usr中的文件吗?

  29. 29

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

热门标签

归档