对于龙卷风,我使用多处理来创建子进程来进行压缩工作。子进程通过os.pipe
是的,现在问题是self.stream.read_until_close
阻止了呼叫,并且tar_worker
没有关闭管道的另一端。
我的代码列表如下:
def tar_worker(fd, path):
'''Tar worker to do the compressing work, directly write data to pipe.'''
fp = os.fdopen(fd, 'w')
tar = tarfile.open(mode='w|', fileobj=fp, dereference=True)
tar.add(path)
tar.close()
fp.close()
class getTarFileHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
@gen.coroutine
def get(self):
recv, sender = os.pipe()
self.p = multiprocessing.Process(target=tar_worker, args=(sender, '/boot/'))
self.p.start()
self.fd = recv
# Create PipeIOStream
self.stream = tornado.iostream.PipeIOStream(self.fd)
self.stream.read_until_close(callback=self.f, streaming_callback=self.send_data)
def f(self, s):
print 'done send work'
self.finish() #close connection
def send_data(self, chunk):
self.write(chunk)
self.flush()
答案 0 :(得分:2)
文件句柄可以跨多个进程共享;在这种情况下,父进程和子进程都有文件描述符指向同一底层管道的两端。父进程和子进程都必须关闭sender
才能使其真正关闭。启动multiprocessing.Process
后,父进程必须执行os.close(sender)
才能关闭管道写入端的副本。这不会阻止子进程写入其副本;一旦父级和子级都关闭了管道写入端的副本,管道的读取端将报告EOF,IOStream读取方法将引发StreamClosedError。