Python Appengine Appstats:我的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

我正在学习在appengine上评测我的应用程序。我不明白为什么我的RPC总时间可能是8秒,而总的视图总时间却在30秒左右

其他延误来源可能来自:

  • 模板渲染
  • 计算时间
  • appengine是否有其他工具让我深入挖掘

    如果这有帮助:

    @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也很长,但看看你查询的批量大小,它们可能会有所帮助