python web 脚本为什么不能热更新

2015-05-13 08:37:43 +08:00
 yakczh

java应用服务器启动以后,要把web项目下用的所有类文件都要加载到内存,修改了源代码,只能重启服务器,但是python应该是动态脚本,为什么修改了脚本以后要用 tornado.autoreload.start() 这样重启服务器

10609 次点击
所在节点    Python
30 条回复
ksc010
2015-05-13 08:54:55 +08:00
python启动后是常住内存的
不跟php一样每次请求“都加载一次”
yakczh
2015-05-13 09:00:56 +08:00
那如果项目变大了,import的文件越多,占用的内存就越大, 跟java一样了
binux
2015-05-13 09:02:26 +08:00
从未听说过,一个项目被抱怨代码多了,占内存大的。
clino
2015-05-13 09:04:19 +08:00
理论上应该也能做到热更新吧,比如说不少uliweb的调试服务器之类为了调试方便就是改完马上应用的,但要是生产环境这么做,出问题的时候不知道是不是用了热更新导致的莫名其妙的问题,估计很少人在生产环境下会这么用
kingname
2015-05-13 09:06:16 +08:00
其实是可以热更新的。如果你见过flask的debug模式,你就知道,你改了一个文件,它自动就加载了。
yakczh
2015-05-13 09:32:49 +08:00
@kingname flask 也是扫苗lib site-packages 下的所有文件, 有更新就重启服务器
yakczh
2015-05-13 09:36:02 +08:00
如果你安装的package比较多,还不如直接ctrl+c 来得快
est
2015-05-13 09:40:08 +08:00
> 为什么修改了脚本以后要用 tornado.autoreload.start() 这样重启服务器

因为显式重启比较好?

框架也可以非显式重启,那么会影响性能的。
awanabe
2015-05-13 10:04:25 +08:00
python代码编译成pyc..你更新了py代码, 需要重启编辑一次...这个就是非编译语言的做法...
yakczh
2015-05-13 10:06:15 +08:00
@awanabe 那这样python是不是跟java一样了?
laoyuan
2015-05-13 10:24:11 +08:00
所以说PHP是。。。我学Python 就是为了写爬虫!
gamexg
2015-05-13 10:32:48 +08:00
说实在的还是手动重启比较好。
比如你这次更新需要修改了10个文件,你刚修改了1个文件,这时候有人访问,如果自动加载新代码的话访问的是更新了半截的网站,出现各种意外都不奇怪。
mkeith
2015-05-13 10:33:29 +08:00
怎么Python就和Java一样了啊
hahastudio
2015-05-13 10:41:59 +08:00
理论上是可以的,有 imp module https://docs.python.org/3/library/imp.html
2.7 也有 reload 函数 https://docs.python.org/2/library/functions.html#reload

不过正如文档里提到的, The init function of extension modules is not called a second time.
当然你可以手工做,但总会出现这样那样的问题。我看到更多的是玩具性质的 script
实际生产环境的话,也许一个临时的 hotfix 用这个机制挺有效,但是真的更新的话,还是重启 server 比较好
caoyue
2015-05-13 11:09:45 +08:00
我觉得不是不能,是没必要=-=
只有设计的时候就考虑了不能重启必须热更新的情况,比如 Erlang 之于电信服务,那支持热更新就是顺理成章的了
weyou
2015-05-13 11:10:00 +08:00
实现一个动态加载的功能就可以了, 需要重新load模块,发个信号给主进程就行了。
raptor
2015-05-13 11:21:00 +08:00
即时重启与否并不是最重要的,重要是能否优雅地重启——即在不中断当前连接的情况下对新连接使用新服务。
bydmm
2015-05-13 11:22:27 +08:00
应该可以热更新 问题是热更新带来的脏读脏写怎么办? 而且项目启动的时候,很多class是需要做缓存来优化性能的。

我不太懂python,但是ruby的 ruby on rails框架就有支持热更新的开发模式和需要重启的生产模式。 我猜应该和楼主的问题有相同的原因
bydmm
2015-05-13 11:24:03 +08:00
@raptor 对服务器进行逐批重启就搞定了,这个java都ok
yakczh
2015-05-13 11:31:23 +08:00
@bydmm ruby怎么实现的? 是不是把app下要用到的rb脚本启动的时候一次性加载到内存里?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/190647

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX