Login

Google App Engine 对 module 的缓存时间

2008-07-16 23:40:58 by kommit

GAE 的文档中提到:import 进来的 module 会被缓存,并用一个例子演示:多次执行 Request Handler 脚本的时候,被 import 进来的模块中的代码不会反复执行。

### mymodule.py
counter = 0
def increment():
    global counter
    counter += 1
    return counter


### myhandler.py
import mymodule

print "Content-Type: text/plain"
print ""
print "My number: " + str(mymodule.increment())

在这个例子中,虽然 mymodule.py 中第一句就是 counter = 0,但是下面的 myhandler 在调用的时候并不会反复执行这一句,因为mymodule 这个模块被缓存了,下次执行 myhandler 的时候直接从缓存中加载了 mymodule 以及其中的变量 counter。

但是,问题来了,我能不能依赖这个缓存机制,用来长期存储存一些全局变量呢?比如网站计数器。答案是不能。为了测试一个模块能被缓存多久而不会重新加载,我在代码的三个模块文件中第一句都加了一个 logging 语句:logging.info("module XXX reloaded"),下面是7月15日的观测结果:

  • I 07-15 11:42PM 52.480 module theme reloaded
  • I 07-15 11:42PM 52.483 module config reloaded
  • I 07-15 11:42PM 52.562 module memcache reloaded
  • I 07-15 07:54PM 07.536 module theme reloaded
  • I 07-15 07:54PM 07.539 module config reloaded
  • I 07-15 04:43PM 44.40 module memcache reloaded
  • I 07-15 04:43PM 11.720 module theme reloaded
  • I 07-15 04:43PM 11.723 module config reloaded
  • I 07-15 12:57PM 55.851 module theme reloaded
  • I 07-15 12:57PM 55.855 module config reloaded
  • I 07-15 12:57PM 55.935 module memcache reloaded
  • I 07-15 12:20PM 12.906 module theme reloaded
  • I 07-15 12:20PM 12.910 module config reloaded
  • I 07-15 12:20PM 12.995 module memcache reloaded
  • I 07-15 11:16AM 11.12 module memcache reloaded
  • I 07-15 11:16AM 04.596 module theme reloaded
  • I 07-15 11:16AM 04.599 module config reloaded
  • I 07-15 09:16AM 22.9 module theme reloaded
  • I 07-15 09:16AM 22.12 module config reloaded
  • I 07-15 09:16AM 22.93 module memcache reloaded
  • I 07-15 08:08AM 32.22 module theme reloaded
  • I 07-15 08:08AM 32.25 module config reloaded
  • I 07-15 08:08AM 32.102 module memcache reloaded
  • I 07-15 06:17AM 05.237 module theme reloaded
  • I 07-15 06:17AM 05.240 module config reloaded
  • I 07-15 06:17AM 05.327 module memcache reloaded
  • I 07-15 02:46AM 44.344 module theme reloaded
  • I 07-15 02:46AM 44.347 module config reloaded
  • I 07-15 02:46AM 44.445 module memcache reloaded

可以看出,logging 语句会每隔一段时间执行一次,也就是说,模块会被重新加载一次,时间长短不等,有可能1小时,也有可能4-5个多小时。。。回到最初的例子,那就是:一旦重新加载,counter 就会再次变成0。

另外,用 appcfg.py update 更新了网站之后,也会被重新加载。

在使用 MemCache 的时候,我用了一个全局变量来存放一些东西(比如 post,commet)的上次修改时间,用来判断 MemCache 中的对象是否过期,但是当时不知道 module 的缓存会在几小时内过期导致那个变量清空,所以现在 MemCache 对象的最长生存时间只有几个小时。。。不过这已经让 CPU 的使用量大大下降了。

前两天把代码改了一下,把全局变量放在了数据库中,模块重新加载的时候就从数据库中重新读取,然后稍微重构了一下 MemCache 的使用方法,但是重构之后又遇到了另外一个问题。(简单地说就是,往 MemCache 中存放 str/unicode 之外的对象,可能导致取不出来,这个问题似乎同样和模块的缓存失效期限有关)

令人高兴的是,昨天,Guido 说已经把这个 bug 修复了,不过我还是打算再观察两天,等真的不出问题了再把代码更新过来。

Tags: python, memcache, bug, appengine

脱胎换骨……呃,重做人

2008-06-14 14:08:52 by kommit

“感谢党,感谢人民,感谢CCTV,Plog 终于,终于支持自定义主题了。”

代码中放了一个 theme 目录,里面包含了若干子目录,每个子目录表示一个主题。其中有一个 default 主题,就是俺之前改了无数次仍然巨丑无比的主题。另外在我提交到 svn 的代码中,还包含了两个从 Free CSS Templates 偷来的主题,现在用的这个就是。

每个主题目录中需要包含一个 css 文件,以及主题所需要的其它文件,比如图片。另外有一个可选的 templates 目录,用来存放重写的模板文件。

在 Config 中选择了新主题之后,用到所需的模板文件会先在主题的目录的 templates 下面寻找,如果找不到,就会用 default/templates 下面的。

这样的话,如果 theme 的作者希望改变一下生成的 html 代码,只需要重写一部分 template 文件,放到该主题的 templates 目录下面就可以了。

添加现成的主题也很方便,只要把主题目录丢到 themes 目录就可以了。

打算再偷几个主题来看看,一是为了增加一些默认可以选择的主题,二是多做几个主题可以再调整一下 default 的模板文件,使得制作 theme 更容易。

不过增加了 theme 机制带来了一个小小的(希望是) drawback:
GAE 把上传的代码文件分为两类,一种是 static 文件,一种是普通的代码。可以在 app.yaml 中指定。前者为了效率的考虑,没有放在代码可以读到的文件系统目录里面,但是 plog 需要动态地读取 theme 目录下的子目录以及 templates 文件,于是 theme 没有作为 static 文件放上去,这样的话那些 css、图片文件之类的就享受不到 static 的好处了,我只好做了一个 request handler 去读取这些文件。估计会带来性能的下降以及 CPU 使用量的上升。

另外 plog 代码中还有一些地方比较占用 CPU,我抽空再优化一下。

Tags: plog, theme, appengine, 美工

几个好消息,和坏消息

2008-05-29 23:31:41 by kommit

好消息:

  1. google app engine 注册不需要排队了。只要有 google 账号就可以创建 app,不过需要短信验证,试了一下输入 +86 我的手机号,可以正常接收 google 的短信。
  2. 提供了两组新的 api,memcache 和 image api。前者还没仔细看,不过看名字,估计对提升性能有帮助;image api 我之前也在期望 google 能提供,不过看了一下文档,似乎只有基本的缩放、旋转、剪裁等功能。没有我期待的 draw_text,给图片加水印、生成验证码之类的功能是没戏了,希望以后能提供。
  3. app engine 公布了收费方案,没仔细看,看起来挺便宜的。对我这种玩玩的来说,免费版的提供的限额足够了。

坏消息:

  1. app engine 似乎有 因为某种原因导致国内用户无法访问 的趋势。希望只是某系统一时抽风。。。。
  2. 似乎 plog 通过网页发文章出了点问题,不知道是哪次修改带来的 bug,我只能通过 API 用 Windows Live Writer 写文章。。。

附问题1的临时解决方案:

下午研究了一下,发现是 209.85.141.118 这个地址坏掉了,而 appengine.google.com 和 *.appspot.com 在我这里解析的时候,DNS 返回的地址有3 种可能:209.85.139.118、209.85.171.118、209.85.141.118,前两个都是好的,如果碰巧遇上第三个,就访问不了。另外如果绑定了 google apps 的域名,那几个 ip 也都是没问题的。

解决方法呢,可以在 %SYSTEM32%\drivers\etc\hosts 里面加上:

209.85.139.118 ***(这里是想要访问的地址).appspot.com
208.85.139.118 appengine.google.com

不过,这也只能方便网站拥有者本人,总不能要求每一个访问你网站的人都去这么设置吧。

Tags: plog, bug, appengine

loscomet.cn

2008-05-23 22:51:01 by kommit

前几天看到消息说万网免费注册 .cn 域名,免费的午餐对我向来是很有吸引力的,我自然不能错过机会,拿了一个过来。

光有域名,但是没有空间啊(穷)....不过看到 google app engine可以绑定自己的域名,于是就试了一下,果然不行。。。原来需要先把域名和 google apps 关联才行。那就去注册 google apps。

果然还是不行,google apps 不让 .cn 域名注册,网上查了一下据说是因为某种原因导致 ghs.google.com 不能在中国访问所以索性不让 .cn 域名注册了。还看到一些说法是找一些国外的代理就可以注册,我试了一下还是不行。。。 后来看到有人说二级域名可以注册,想起来我还申请过一个 *.3322.org 的动态域名,然后用这个域名注册 google apps 居然成功了。。。。

不过 google apps 需要验证域名的所有权才能让你使用这个域名,验证方法有两种,一种简单的方法是创建一条它指定的 CNAME 记录,我这个二级域名似乎不支持。另一种方法是往那个域名指向的网站上上传一个它指定内容和名字的文本文件,于是我在自己的机器上开了个 web server,然后把域名指过来。。。。

不过我的 loscomet.cn 还在闲置啊,不甘心,看了一下 google apps 还支持别名,而且别名竟然没有 .cn 的限制。hoho,把 loscomet.cn 作为别名添加到 google apps 里面,然后用创建 CNAME 记录的方式通过了验证。然后去 google app engine 设置里面添加了这个域名,幸运的是,这个不需要把域名指向 ghs.google.com,而是下面4个 IP 地址中的任何一个就行了:

  • 216.239.32.21
  • 216.239.34.21
  • 216.239.36.21
  • 216.239.38.21

设置好之后,等了一晚上,终于能访问了,心里美滋滋的。

真是折腾!

哈哈,谁让俺穷呢,买不起 .com 域名,俺就用免费的 .cn;买不起空间,俺就用 GAE;他们俩不兼容,俺就折腾。另外,俺终于把 google adsense 放在这里了,这也算实现了当初俺写这个 blog 的初衷(嗯,初衷!!)。不过话说回来,两年前注册的 google adsense 帐户里面,到现在还只有 0.45 刀,还都是推介 Firefox 赚的。。。不过话再说回来,Mozilla Firefox 真的是一个很不错的浏览器。。。。(此处省略5万字)

Tags: life, 折腾, 域名, appengine

Bug again...

2008-05-08 15:24:42 by kommit

Google app engine 的 sdk 还有不少问题,今天又发现一个。
HTTP 协议规定 response header 的结尾应该是两个CRLF,也就是\r\n\r\n,但是实际上在 Windows 下运行 dev_appserver.py 的时候,结尾成了LFCRLF。

实际上大多数客户端都不太计较这些的,但是为了测试 api,我选用了伟大的 M$ 的产品—— Windows Live Writer,人家说发现我的 header 不标准,然后解决这个问题之前不给我 continue....

Tags: bug, appengine