0

我正在使用 xlwt 生成一个 excel 文件并将其作为 blob 属性存储在数据存储中。但是在生成期间得到了这个错误"Timeout: The datastore operation timed out, or the data was temporarily unavailable."

我注意到使用 xlutils 我们可以更新现有文件。我打算做这样的事情,第一次我会用我的一半数据创建文件,然后使用另一个任务来完成文件创建。

有没有更好的方法来做到这一点?

这是我当前的代码:

from xlwt import *
wb = Workbook()
ws0 = wb.add_sheet("Sheet 1")

style = XFStyle()
style.font.name = 'Tahoma'   

currency_style = XFStyle()
currency_style.num_format_str = '$#,##0.00'       

ws0.write(0, 0, 'Col 1', style)
ws0.write(0, 1, 'Col 2', style)
ws0.write(0, 2, 'Col 3', style)
ws0.write(0, 3, 'Col 4', style)
rx = 1

for each in db_result:                
      ws0.write(rx, 0, each.col1, style)
      ws0.write(rx, 1, each.col2, style)
      ws0.write(rx, 2, each.col3, style)

      try:
          ws0.write(rx, 3, round(float(each.col4), 2), currency_style)
      except:
          ws0.write(rx, 3, each.col4, style)

      rx = rx + 1                
      db.delete(each)

buffer = StringIO.StringIO()
wb.save(buffer)
contents = buffer.getvalue()

f = myfile()
f.name = 'File 1'
f.file = db.Blob(contents)
f.put()
4

1 回答 1

1

如果它只是一个超时问题,您的代码运行时间更长,那么您可以使用一个任务来代替超时,这会给您一个 10 分钟的超时而不是 60 秒:使用延迟库的后台工作

from google.appengine.ext import deferred

  def do_something_expensive(a, b, c=None):
      logging.info("Doing something expensive!")
      # Do your work here

  # Somewhere else
  deferred.defer(do_something_expensive, "Hello, world!", 42, c=True)

因此,将您的程序包装在一个可以传递给 defer 方法的函数中。或者看看使用其他一些选项,如后端:

https://developers.google.com/appengine/docs/python/backends/

应用引擎后端是您的应用程序实例,它们不受请求截止日期的影响,并且可以访问比普通实例更多的内存(高达 1GB)和 CPU(高达 4.8GHz)。它们专为需要更快性能、大量可寻址内存以及连续或长时间运行的后台进程的应用程序而设计。后端有多种尺寸和配置,并按正常运行时间而不是 CPU 使用率计费。

于 2013-10-26T14:33:35.510 回答