文件在进程中使用时自动关闭

时间:2014-08-19 06:08:28

标签: python file python-2.7 multiprocessing

以下代码有效:

import multiprocessing
import threading
import time

file_path = 'C:/TEST/0000.txt'

class H(object):
    def __init__(self, path):
        self.hash_file = open(file_path, 'rb')
    def read_line(self):
        print self.hash_file.readline()

h = H(file_path)
h.read_line()

但是当我在进程中使用时:

import multiprocessing
import threading
import time

file_path = 'C:/TEST/0000.txt'

class Worker(multiprocessing.Process):
    def __init__(self, path):
        super(Worker, self).__init__()
        self.hash_file = open(path, 'rb')
    def run(self):
        while True:
            for i in range(1000):
                print self.hash_file.readline()
                time.sleep(1.5)


if __name__ == '__main__':
    w = Worker(file_path)
    w.start()
    w.join()

提出异常:

Process Worker-1:
Traceback (most recent call last):
  File "E:\Python27\lib\multiprocessing\process.py", line 258, in _bootstrap
    self.run()
  File "C:\ts_file_open.py", line 31, in run
    print self.hash_file.readline()
ValueError: I/O operation on closed file

因为open花了很多钱而且我只需要读取文件,我认为打开它一次就足够了。但是为什么这个文件对象在进程运行时被关闭了?而且我也想把这个文件对象传递给子进程的子进程和子线程。

1 个答案:

答案 0 :(得分:4)

这会失败,因为您在父进程中打开文件,但尝试在子进程中使用它。来自父进程的文件描述符不会由Windows上的子进程继承(因为它不使用os.fork来创建新进程),因此子进程中的读取操作失败。请注意,此代码实际上可以在Linux上运行,因为由于os.fork的性质,文件描述符会被子项继承。

另外,我不认为open操作本身特别昂贵。实际上读取文件可能很昂贵,但开放操作本身应该很快。