python - 防止多处理库中的文件句柄继承

标签 python windows multiprocessing handle

在 Windows 上使用多处理似乎任何打开的文件句柄都由生成的进程继承。这会产生锁定它们的令人不快的副作用。

我感兴趣的是:
1) 防止继承
2) 从派生进程中释放文件的方法

考虑以下代码,它在 OSX 上运行良好,但在 os.rename 时在 Windows 上崩溃

from multiprocessing import Process
import os

kFileA = "a.txt"
kFileB = "b.txt"

def emptyProcess():
    while 1:
        pass

def main():
    # Open a file and write a message
    testFile = open(kFileA, 'a')
    testFile.write("Message One\n")

    # Spawn a process
    p = Process(target=emptyProcess)
    p.start()

    # Close the file
    testFile.close()

    # This will crash
    # WindowsError: [Error 32] The process cannot access the file
    #               because it is being used by another process
    os.rename(kFileA, kFileB)

    testFile = open(kFileA, 'a')
    testFile.write("Message Two\n")
    testFile.close()

    p.terminate()


if __name__ == "__main__":
    main()

最佳答案

fileno() 方法返回由运行时库分配的文件号。给定文件编号,然后您可以调用 msvcrt.get_osfhandle() 来获取 Win32 文件句柄。在对 SetHandleInformation 的调用中使用此句柄。所以像下面这样的东西可能会起作用:

win32api.SetHandleInformation(
    msvcrt.get_osfhandle(testFile.fileno()),
    win32api.HANDLE_FLAG_INHERIT,
    0)

我不确定 win32api 模块的确切用法,但这应该有助于弥合 Python 文件对象和 Win32 句柄之间的差距。

关于python - 防止多处理库中的文件句柄继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/948119/

相关文章:

python - 为什么我在 Tkinter 中出现未绑定(bind)的本地错误

python - 使用多处理时文件头被截断

python - <span> 内没有类的 BS4 文本

data-visualization - 如何在 python 中绘制超平面 SVM?

python - 使用外部命令多重处理数千个文件

windows - 使用批处理文件打开多个 PDF 文档

windows - 无法使用 GHC 7.8rc2 和 Windows 7(或使用 cabal 安装包)编译简单的 hello world

c - 围绕 .lib 文件编写与 GCC 兼容的包装器

python - 防止在多处理中调用 __del__

python - 将 Spacy Parser 应用于具有多处理功能的 Pandas DataFrame