2013-02-15 63 views
3

我遇到了Python多处理包的问题。下面是一个简单的示例代码,说明我的问题。Python多处理,ValueError:关闭的文件上的I/O操作

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 . . . 

似乎在创建新进程的过程中文件句柄“失去”了。有人可以解释发生了什么事吗?

+4

如果你点击左上角的Console图标,你会发现菜单选项来选择和复制文本。 *请*使用该功能将traceback *作为文本*复制到您的帖子中。 – 2013-02-15 16:46:59

+1

http://stackoverflow.com/questions/1075443/multiprocessing-share-objects-with-file-handle-attribute-between-processes ...你可能想把你的输出转储到一个队列中,当你所有的进程都是完成后,将输出从队列中弹出并通过主进程写出来 – pyInTheSky 2013-02-15 17:04:15

回答

7

我在过去曾遇到过类似的问题。不知道它是在多处理模块内部完成的,还是默认情况下open设置了close-on-exec标志,但我确信主进程中打开的文件句柄是在多处理子项中关闭的

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

例子:

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) 
+0

谢谢isedev!我希望其他对象不会出现类似的问题。你知道吗? – Ray 2013-02-15 17:21:13

+0

不是我所知道的。 – isedev 2013-02-15 17:22:50

相关问题