Ray*_*Ray 3 python file multiprocessing
我遇到了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()
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到以下错误.
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 . . .
Run Code Online (Sandbox Code Playgroud)
似乎在创建新进程期间文件句柄以某种方式"丢失".有人可以解释一下发生了什么吗?
我过去也遇到过类似的问题.不确定它是在多处理模块中完成还是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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2740 次 |
| 最近记录: |