以下代码有效:
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
花了很多钱而且我只需要读取文件,我认为打开它一次就足够了。但是为什么这个文件对象在进程运行时被关闭了?而且我也想把这个文件对象传递给子进程的子进程和子线程。
答案 0 :(得分:4)
这会失败,因为您在父进程中打开文件,但尝试在子进程中使用它。来自父进程的文件描述符不会由Windows上的子进程继承(因为它不使用os.fork
来创建新进程),因此子进程中的读取操作失败。请注意,此代码实际上可以在Linux上运行,因为由于os.fork
的性质,文件描述符会被子项继承。
另外,我不认为open
操作本身特别昂贵。实际上读取文件可能很昂贵,但开放操作本身应该很快。