gpt4 book ai didi

Python 多处理,ValueError : I/O operation on closed file

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:46 30 4
gpt4 key购买 nike

我在使用 Python 多处理包时遇到问题。下面是一个简单的示例代码,可以说明我的问题。

import multiprocessing as mp
import time

def test_file(f):
f.write("Testing...\n")
print f.name
return None

if __name__ == "__main__":
f = open("test.txt", 'w')
proc = mp.Process(target=test_file, args=[f])
proc.start()
proc.join()

当我运行它时,出现以下错误。

Process Process-1:
Traceback (most recent call last):
File "C:\Python27\lib\multiprocessing\process.py", line 258, in _bootstrap
self.run()
File "C:\Python27\lib\multiprocessing\process.py", line 114, in run
self.target(*self._args, **self._kwargs)
File "C:\Users\Ray\Google Drive\Programming\Python\tests\follow_test.py", line 24, in test_file
f.write("Testing...\n")
ValueError: I/O operation on closed file
Press any key to continue . . .

在创建新进程的过程中,文件句柄似乎以某种方式“丢失”了。有人可以解释一下这是怎么回事吗?

最佳答案

我以前也遇到过类似的问题。不确定它是否在多处理模块内完成,或者 open 是否默认设置了 close-on-exec 标志,但我确信在主进程中打开的文件句柄 已关闭 在多处理子进程中。

明显的解决方法是将文件名作为参数传递给子进程的初始化函数并在每个子进程中打开一次(如果使用池),或者将它作为参数传递给目标函数并打开/关闭每次调用。前者需要使用全局来存储文件句柄(不是一件好事)——除非有人能告诉我如何避免这种情况:)——而后者可能会导致性能下降(但可以直接与 multiprocessing.Process 一起使用).

前者的例子:

filehandle = None

def child_init(filename):
global filehandle
filehandle = open(filename,...)
../..

def child_target(args):
../..

if __name__ == '__main__':
# some code which defines filename
proc = multiprocessing.Pool(processes=1,initializer=child_init,initargs=[filename])
proc.apply(child_target,args)

关于Python 多处理,ValueError : I/O operation on closed file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14899355/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com