我喜欢Google App Engine开发环境的一个原因是,我不必在每次更改任何python源文件、其他静态文件甚至配置文件时都重新启动服务器。它毁了我,当我使用其他服务器环境(tornadoweb、web.py、node.js)时,我忘记重新启动服务器。
有人能解释一下GAE是怎么做到的吗?让其他服务器(至少是基于python的)实现同样的功能有多难?
发布于 2011-05-13 13:04:03
您可以查看dev_appserver.py(link)的源代码。看起来像是ModuleManager复制了sys.modules,并监视每个模块以跟踪基于时间的更改:
class ModuleManager(object):
"""Manages loaded modules in the runtime.
Responsible for monitoring and reporting about file modification times.
Modules can be loaded from source or precompiled byte-code files. When a
file has source code, the ModuleManager monitors the modification time of
the source file even if the module itself is loaded from byte-code.
"""http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/dev_appserver.py#3636
发布于 2011-05-13 11:26:31
许多see服务器,如GAE,都使用python reload模块来查看代码更改的效果,而无需重新启动服务器进程。
import something
if is_changed(something)
somthing = reload(something)引用自python文档:当执行reload(模块)时:
Python模块的代码被重新编译,模块级代码被重新执行,定义了一组新的对象,这些对象被绑定到模块的字典中的名称。不会第二次调用扩展模块的init函数。
与Python中的所有其他对象一样,旧对象只有在其引用计数降为零后才会被回收。
模块命名空间中的名称将更新为指向任何新的或更改的对象。对旧对象的其他引用(如模块外部的名称)不会重新绑定为引用新对象,如果需要,必须在出现新对象的每个命名空间中进行更新。
https://stackoverflow.com/questions/5986500
复制相似问题