在 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/