V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yaotian
V2EX  ›  Django

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

  •  
  •   yaotian · 2012-12-04 07:46:44 +08:00 · 6216 次点击
    这是一个创建于 4373 天前的主题,其中的信息可能已经有所发展或是发生改变。
    15 条回复    1970-01-01 08:00:00 +08:00
    Livid
        1
    Livid  
    MOD
       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
       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
       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
       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   ·   实用小工具   ·   2656 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:24 · PVG 23:24 · LAX 07:24 · JFK 10:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.