Python Appengine Appstats:我的RPC调用总计8秒,但我的总计是30秒。为什么?
我正在学习在appengine上评测我的应用程序。我不明白为什么我的RPC总时间可能是8秒,而总的视图总时间却在30秒左右 其他延误来源可能来自:Python Appengine Appstats:我的RPC调用总计8秒,但我的总计是30秒。为什么?,python,google-app-engine,profiling,Python,Google App Engine,Profiling,我正在学习在appengine上评测我的应用程序。我不明白为什么我的RPC总时间可能是8秒,而总的视图总时间却在30秒左右 其他延误来源可能来自: 模板渲染 计算时间 appengine是否有其他工具让我深入挖掘 如果这有帮助: @app.route('/orders/schedule/all/', methods=['GET', 'POST']) @login_required def generate_schedule_for_all_orders(): """Merge all the
@app.route('/orders/schedule/all/', methods=['GET', 'POST'])
@login_required
def generate_schedule_for_all_orders():
"""Merge all the orders together in one big schedule
TODO: put range by default.
TODO: think of default empty scenario
"""
orders = key_dict(Order.query().fetch())
# TODO: somehow there's a lot of orphaned tasks in development. For now,
# we will just query for non orphaned tasks to prevent errors piling up
tasks = Task.query(Task.order.IN(orders.keys())).order(Task.action).fetch()
ds = sorted([t.date for t in tasks])
start, end = ds[0], ds[-1]
dates = range_for_dates(start, end)
return render_template('backward_schedule.html',
tasks=tasks,
orders=orders,
producetypes=key_dict(ProduceType.query().fetch()),
dates=dates,
display_order_info=True)
这是模板宏:
{% macro generate_calendar(tasks, orders, producetypes, dates, display_order_info) %}
<table class='table table-striped table-bordered table-hover'>
<tr>
<th class='weekends'>Sunday</th>
<th>Monday</th>
<th>Tuesday</th>
<th>Wednesday</th>
<th>Thursday</th>
<th>Friday</th>
<th>Saturday</th>
</tr>
{# start is always on a Sunday while end is always on a saturday #}
{% for week in dates %}
<tr>
<td class='weekends'>{{ _display_day(week[0], tasks, orders, display_order_info) }}</td>
<td>{{ _display_day(week[1], tasks, orders, display_order_info) }}</td>
<td>{{ _display_day(week[2], tasks, orders, display_order_info) }}</td>
<td>{{ _display_day(week[3], tasks, orders, display_order_info) }}</td>
<td>{{ _display_day(week[4], tasks, orders, display_order_info) }}</td>
<td>{{ _display_day(week[5], tasks, orders, display_order_info) }}</td>
<td class='weekends'>{{ _display_day(week[6], tasks, orders, display_order_info) }}</td>
</tr>
{% endfor %}
</table>
{% endmacro %}
{% macro _display_day(a_date, tasks, orders, display_order_info) %}
{% if a_date.day == 1 %}
<div class='date'>{{ a_date.strftime('%B') }} {{ a_date.day }}</div>
{% else %}
<div class='date'>{{ a_date.day }}</div>
{% endif %}
<ul class='list-group'>
{% for task in tasks %}
{% set order = orders[task.order] %}
{% set order_entry = order.get_entry(task.order_entry_serial) %}
{% if task.date == a_date %}
<li class='list-group-item'>
{% if display_order_info %}
<a href="{{ url_for('view_order', order_id=task.order.id()) }}">
{{ order.name }}
</a>
{% endif %}
<span>{{ order_entry.quantity }}</span>
<span>{{ producetypes[order_entry.producetype].name() }}</span>
<span>{{ task.action }}</span>
</li>
{% endif %}
{% endfor %}
</ul>
{% endmacro %}
{%macro生成日历(任务、订单、产品类型、日期、显示订单信息)%}
星期日
星期一
星期二
星期三
星期四
星期五
星期六
{开始总是在星期天,结束总是在星期六}
{日期%%中的周百分比}
{{{显示日(周[0],任务,订单,显示订单信息)}
{{{显示日(第[1]周),任务,订单,显示订单信息}
{{{显示日(周[2],任务,订单,显示订单信息)}
{{{显示日(第[3]周),任务,订单,显示订单信息}
{{{显示日(第[4]周),任务,订单,显示订单信息)}
{{{显示日(第[5]周),任务,订单,显示订单信息}
{{{显示日(第[6]周),任务,订单,显示订单信息}
{%endfor%}
{%endmacro%}
{%macro\u display\u day(日期、任务、订单、显示订单信息)%}
{%如果a_date.day==1%}
{{a_date.strftime('%B')}{{a_date.day}}
{%else%}
{{a_date.day}
{%endif%}
{tasks%%中任务的%s}
{%set order=orders[task.order]}
{%set order\u entry=order.get\u entry(task.order\u entry\u serial)%}
{%if task.date==a_date%}
-
{%if display\u order\u info%}
{%endif%}
{{order_entry.quantity}
{{producetypes[order_entry.producetype].name()}
{{task.action}
{%endif%}
{%endfor%}
{%endmacro%}
一些你应该看的东西。首先删除所有日历生成代码,然后使用appstats重新运行,看看这是否占用了时间。检查日志,看看这个请求是否也是一个启动请求。@TimHoffman我试着使用memcache看看它是否能改善渲染效果,但我遇到了问题;(但您使用memcache只是为了节省一些数据库时间。memcache无法加快渲染速度,只能访问渲染的数据。如果HTML生成速度较慢,则除非缓存HTML,否则任何memcache都无法加快渲染速度。请先找出占用时间的位置,并在查询中使用更大的显式批处理大小。D默认批次为20@TimHoffman我接受了你的建议和个人资料,有日历生成和没有日历生成:6900ms与39711ms之间的差异非常惊人。我将开始调查jinja生成需要多长时间。谢谢!虽然6900ms也很长,但看看你查询的批量大小,它们可能会有所帮助