龙卷风如何使用管道异步向客户端发送数据?

时间:2015-07-24 00:04:40

标签: python tornado tar data-synchronization

对于龙卷风,我使用多处理来创建子进程来进行压缩工作。子进程通过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()

1 个答案:

答案 0 :(得分:2)

文件句柄可以跨多个进程共享;在这种情况下,父进程和子进程都有文件描述符指向同一底层管道的两端。父进程和子进程都必须关闭sender才能使其真正关闭。启动multiprocessing.Process后,父进程必须执行os.close(sender)才能关闭管道写入端的副本。这不会阻止子进程写入其副本;一旦父级和子级都关闭了管道写入端的副本,管道的读取端将报告EOF,IOStream读取方法将引发StreamClosedError。