yaotian
V2EX  ›  Django

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

  •  
  •   yaotian · Dec 4, 2012 · 7066 views
    This topic created in 4915 days ago, the information mentioned may be changed or developed.
    15 replies    1970-01-01 08:00:00 +08:00
    Livid
        1
    Livid  
    MOD
    PRO
       Dec 4, 2012
    启动至少两个 instance,在不同的端口。绑定 80 的那个用于所有读操作,另外一个用于这样的耗时操作。

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

    我的某个项目中,Tornado 框架,12 个读 instance,12 个写 instance,通过 least connection 方式做 load balance。
    yaotian
        4
    yaotian  
    OP
       Dec 4, 2012
    @Livid 之前没考虑过起多个instance的方法。django支持这样的least connection方式吗?你的这个项目架构有分享吗?想读一读
    Livid
        5
    Livid  
    MOD
    PRO
       Dec 4, 2012   ❤️ 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  
       Dec 4, 2012
    也许你可以试试celery
    反正这种东西还是扔到队列里比较好吧
    Livid
        7
    Livid  
    MOD
    PRO
       Dec 4, 2012
    @adamwen 和主站放到一起的好处就是尽量复用代码,比如 data models 操作相关的那些。

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

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

    我的理解对吧?
    adamwen
        10
    adamwen  
       Dec 4, 2012
    @yaotian
    应该是为了能够并发的处理request
    多于instance个数的未处理的request会被阻塞到nginx的队列里直到有一个instance处理完
    BigZ
        11
    BigZ  
       Dec 4, 2012
    分成两个请求,view.py用于展示页面,较慢的计算过程用ajax返回数据更新页面,
    ipconfiger
        12
    ipconfiger  
       Dec 4, 2012
    老老实实的用队列放后端吧,一切不用队列的说法都是异端
    yaozhifeng
        13
    yaozhifeng  
       Dec 4, 2012
    原来Supervisor可以这样用,太精彩了。学习
    cabbala
        14
    cabbala  
       Dec 4, 2012
    Tornado的话搞成异步操作最好了
    yxlwfds
        15
    yxlwfds  
       Mar 2, 2013
    1.5中新增了一个关于这个的,可以看下。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5598 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 02:00 · PVG 10:00 · LAX 19:00 · JFK 22:00
    ♥ Do have faith in what you're doing.