django中的view.py,如果一个方法中有一个比较耗时的操作,比如分析一个网页,这样的操作适合放在view.py中吗?不过不适合,大家怎么处理的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yaotian
V2EX    Django

django中的view.py,如果一个方法中有一个比较耗时的操作,比如分析一个网页,这样的操作适合放在view.py中吗?不过不适合,大家怎么处理的?

  •  
  •   yaotian 2012-12-04 07:46:44 +08:00 6643 次点击
    这是一个创建于 4696 天前的主题,其的信息可能已经有所发展或是发生改变。
    15 条回复    1970-01-01 08:00:00 +08:00
    Livid
        1
    Livid  
    MOD
    PRO
       2012-12-04 07:53:02 +08:00
    启动至少两个 instance,在不同的端口。绑定 80 的那个用于所有读操作,另外一个用于这样的耗时操作。

    通过 queue 去 call 另外一个。
    yaotian
        2
    yaotian  
    OP
       2012-12-04 08:01:38 +08:00
    @Livid 请求在等待这个长操作的结果。有时候比较长的时候30s,下一个请求被block住了。
    Livid
        3
    Livid  
    MOD
    PRO
       2012-12-04 08:03:41 +08:00
    @yaotian 这就是为什么要在两个端口启动 _至少_ 两个 instance 的原因。

    我的某个项目中,Tornado 框架,12 个读 instance,12 个写 instance,通过 least connection 方式做 load balance。
    yaotian
        4
    yaotian  
    OP
       2012-12-04 08:10:36 +08:00
    @Livid 之前没考虑过起多个instance的方法。django支持这样的least connection方式吗?你的这个项目架构有分享吗?想读一读
    Livid
        5
    Livid  
    MOD
    PRO
       2012-12-04 08:22:38 +08:00   1
    @yaotian 我是这样做的:

    1. 通过 supervisord 管理启动的 instances,每个一个端口,比如 30000-30009 是前段端口,30010-30019 是后端端口。

    2. 在 nginx 里把 30000-30009 做成前端的 upstream,30010-30019 是后端的 upstream。nginx 支持 least_conn 方式的负载均衡。

    3. 然后通过 nginx 的 allow/deny 规则让后端 upstream 只能通过 127.0.0.1 访问。

    4. 在 Tornado 里通过 rq 去 call 后端的那个域名。
    adamwen
        6
    adamwen  
       2012-12-04 08:38:24 +08:00
    也许你可以试试celery
    反正这种东西还是扔到队列里比较好吧
    Livid
        7
    Livid  
    MOD
    PRO
       2012-12-04 08:40:01 +08:00
    @adamwen 和主站放到一起的好处就是尽量复用代码,比如 data models 操作相关的那些。

    如果单独为 rq/celery 写 tasks,那么很多 HTTP 环境里的上下文可能都没法用。
    adamwen
        8
    adamwen  
       2012-12-04 09:21:14 +08:00
    @Livid 是个不错的主意
    通过nginx的load balance的request队列 避免了自己再去写队列

    PS:
    你那个前端接口和后端接口只是为了做load balance么
    如果是楼主的问题的话 可以分出一个instance就行
    把不断的去call 后端域名
    yaotian
        9
    yaotian  
    OP
       2012-12-04 12:07:17 +08:00
    @Livid 感谢。写的非常清楚。已经了解大体思路。
    多说几句为长操作起的10个instance:
    起那么多instance的原因是当其中一个instance还在执行那个长操作的时候, nginx的upstream可以将后来的request分配到其它的instance, 举个例子同时来了十个request, 他们会被分配到不同的instance上, 第11个就得等待了。

    我的理解对吧?
    adamwen
        10
    adamwen  
       2012-12-04 12:28:10 +08:00
    @yaotian
    应该是为了能够并发的处理request
    多于instance个数的未处理的request会被阻塞到nginx的队列里直到有一个instance处理完
    BigZ
        11
    BigZ  
       2012-12-04 15:23:47 +08:00
    分成两个请求,view.py用于展示页面,较慢的计算过程用ajax返回数据更新页面,
    ipconfiger
        12
    ipconfiger  
       2012-12-04 16:01:54 +08:00
    老老实实的用队列放后端吧,一切不用队列的说法都是异端
    yaozhifeng
        13
    yaozhifeng  
       2012-12-04 16:15:41 +08:00
    原来Supervisor可以这样用,太精彩了。学习
    cabbala
        14
    cabbala  
       2012-12-04 16:47:06 +08:00
    Tornado的话搞成异步操作最好了
    yxlwfds
        15
    yxlwfds  
       2013-03-02 19:44:09 +08:00
    1.5中新增了一个关于这个的,可以看下。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4580 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 10:06 PVG 18:06 LAX 03:06 JFK 06:06
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86