好吧,我有一个非常复杂的性能问题。我正在构建一个内容管理系统,其中一个特性应该是使用不同的模板生成大量的.docx
文件。我从Webodt+Abiword开始。但是模板变得太复杂了,所以我不得不把我的后端切换到Templated-docs+LibreOffice。我的问题是从哪里开始的。在
我使用:
我有一个处理.docx
呈现的API。我将展示其中一个视图,作为示例,它们非常相似:
@permission_classes((permissions.IsAdminUser,))
class BookDocxViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
def retrieve(self, request, *args, **kwargs):
queryset = Pupils.objects.get(id=kwargs['pk'])
serializer = StudentSerializer(queryset)
context = dict(serializer.data)
doc = fill_template('crm/docs/book.ott', context, output_format='docx')
p = u'docs/books/%s/%s_%s_%s.doc' % (datetime.now().date(), context[u'surname'], context[u'name'], datetime.now().date())
with open(doc, 'rb') as f:
content = f.read()
path = default_storage.save(p, ContentFile(content))
f.close()
return response.Response(u'/media/' + path)
当我第一次调用它时,它会创建一个.docx
文件,保存到我的default_storage
中,然后返回一个下载链接。但是当我再次尝试这样做时,或者使用另一个方法(它可以与另一个模板和上下文一起工作),我的服务器就会在没有任何日志的情况下崩溃。我最后看到的是
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
如果立即第二次调用我的方法(不到一秒钟)我试着使用调试器——它说我的服务器在这一行崩溃了:
doc = fill_template('crm/docs/book.ott', context, output_format='docx')
我敢打赌发生的事情是:
templated_docs
启动LibreOffice后端,然后没有停止它templated_docs
再次尝试启动LibreOffice后端,但它已经很忙了。在templated_docs
)这不是REST框架或不使用FileResponce()
的问题。
我已经试过用常规视图来测试它了。在
问题是一样的。在
好吧。这条线在攻击我的服务器:
# pylokit/lokit.py
self.lokit = lo.libreofficekit_hook(six.b(lo_path))
好吧,那是
templated_docs
中的一个错误。我是对的,这是因为templated_docs
试图启动两次LibreOffice。正如它在pylokit
documentation中所说:这意味着使用
pylockt
的进程应该在之后被终止。但我们不能杀死Django服务器。所以我决定使用多重处理:我反对一个issue,做了一个pull request。在
相关问题 更多 >
编程相关推荐