jakeyfly
V2EX  ›  问与答

python3 有没有什么库 是发布任务--->管道<----执行者 这样的

  •  
  •   jakeyfly · Mar 30, 2018 · 2393 views
    This topic created in 2980 days ago, the information mentioned may be changed or developed.

    Celery 我有去看了下 好像跟我想的不一样 是个爬虫应用 我的想法简单描述是这样: 比如考试吧,老师是分发考卷的(往队列里 比如 redis 里 塞考卷), 班级就像一个队列,学生们都去班上拿考卷做题目(处理从队列中取数据处理)----做完了题目要交卷(存入数据库或用 orm 操作)

    以上描述有点乱,因为我自己本来想实现的,主要因为主流的 scrapy 不适合这个项目,自己去写了后发现,我这样的菜 B,根本完在不了。就想问问有没有什么现成的库包,可以解决这个流程问题。

    中间在处理上上的细节,先不考虑(并发多线程之类感觉不是主要问题,增量可能是个问题。)

    其实我说的好像就是生产者,消费者模型,但是我总是搞不清楚这个流程

    28 replies    2018-03-30 12:23:15 +08:00
    bazingaterry
        1
    bazingaterry  
       Mar 30, 2018 via iPhone
    消息隊列?
    congeec
        2
    congeec  
       Mar 30, 2018 via iPhone
    FIFO, 来,楼下随手写一个
    1iuh
        3
    1iuh  
       Mar 30, 2018
    celery 就是做这个的呀。。
    jakeyfly
        4
    jakeyfly  
    OP
       Mar 30, 2018
    @bazingaterry 是吧 最好是基于 redis 的 能保存状态的
    jakeyfly
        5
    jakeyfly  
    OP
       Mar 30, 2018
    @1iuh celery 是任务啊 我这个需求应该是发数据给任务让任务跑起来
    1iuh
        6
    1iuh  
       Mar 30, 2018
    @jakeyfly #5 你把数据传过去就是了
    laxenade
        7
    laxenade  
       Mar 30, 2018 via Android
    自带的 Multiprocessing 感觉就符合 lz 的要求
    jakeyfly
        8
    jakeyfly  
    OP
       Mar 30, 2018
    @laxenade 这不是进程 吗
    wellsc
        9
    wellsc  
       Mar 30, 2018
    rq
    binux
        10
    binux  
       Mar 30, 2018
    Celery 和你想的是一样的,至少可以实现你想的。
    ericls
        11
    ericls  
       Mar 30, 2018
    celery
    jakeyfly
        12
    jakeyfly  
    OP
       Mar 30, 2018
    @binux 我看了教程 好像 他定义的是任务 并不是队列啊
    jakeyfly
        13
    jakeyfly  
    OP
       Mar 30, 2018
    @wellsc RQ 是啥
    jakeyfly
        14
    jakeyfly  
    OP
       Mar 30, 2018
    @binux 我觉得 celery 更像 futuer
    Trim21
        15
    Trim21  
       Mar 30, 2018 via Android
    ericls
        16
    ericls  
       Mar 30, 2018 via iPhone
    @jakeyfly 你想的话 用 channels 也行 我就用 channels 做过任务队列……
    jakeyfly
        17
    jakeyfly  
    OP
       Mar 30, 2018
    @Trim21 这好像不错,不过这执行的有点快啊 爬虫太快了会被 BAN 的 有没有办法控制间隔或者速度啊
    jakeyfly
        18
    jakeyfly  
    OP
       Mar 30, 2018
    @ericls 好高端 还没接触过
    binux
        19
    binux  
       Mar 30, 2018 via Android
    @jakeyfly 你只使用一种任务带上你要的数据,那就是队列了
    laxenade
        20
    laxenade  
       Mar 30, 2018
    @jakeyfly #8 你想分布的话用 multiprocessing 就不行了,但如果只是一台机子的话,multiprocessing 完全够了。
    fiht
        21
    fiht  
       Mar 30, 2018
    伪需求。
    重一点的 celery,轻一点的 rq。
    再轻一点的 自己用 redis push 和 pop。
    这些都不合适说明你的问题不是这个消息队列的问题。

    另:
    #17 有没有办法控制间隔和速度,这个应该是你爬虫代码(消费者应该要考虑的事情),解决办法很多,例如抓完一个之后 sleep 一段时间,或者将抓取失败时随机等待一段时间,或者抓取失败的丢入一个需要重新抓取的任务队列。
    jakeyfly
        22
    jakeyfly  
    OP
       Mar 30, 2018
    @fiht 可能我没说明白 不好意思哈 我换种说法,比如 我监控 1000 个页面,我 20 分钟扫描一次这一千个页面,任务发布需要从另一个地方提取数据构造这一千个 URL,压进队列里,我想控制的是这一千个 URL 之间的频率,比如扫 20 个休息 10 秒,这 20 个是并发多线程 ,我现在是用 futues 弄的 设置 20 个线程 他就是同时爬 20 个 但是是连续的。我怕我的代理池顶不住,就想控制其频率。而且这样完全自己写,发布任务的轮询实现的也不理想。就想有没有成熟的包或框架可以用。(其间还要根据每个 URL 的壮态,判定是不是剔除出来,不再发布这个任务)
    tabris17
        23
    tabris17  
       Mar 30, 2018
    单机的话用命名管道就可以了
    Kilerd
        24
    Kilerd  
       Mar 30, 2018
    其实就是 任务队列而已啊。
    locktionc
        25
    locktionc  
       Mar 30, 2018
    Redis 有一个发布订阅功能,你可以看看。

    更高级的有 Kafka,你也可以看看。
    jakeyfly
        26
    jakeyfly  
    OP
       Mar 30, 2018
    @locktionc 有了解过 但总感觉 有那么点不对
    wellsc
        27
    wellsc  
       Mar 30, 2018 via iPhone
    @laxenade 其实 multiprocessing 也支持分布式的
    NingAnMe
        28
    NingAnMe  
       Mar 30, 2018
    扫 20 个休息 10 秒
    不想用 scrapy,就自己写一层逻辑控制一下

    最简单的办法还是用 scrapy,你需要的功能都有,想怎么控制怎么控制。
    可以学一下,多一点学习时间,就减一点开发时间。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5306 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 79ms · UTC 08:33 · PVG 16:33 · LAX 01:33 · JFK 04:33
    ♥ Do have faith in what you're doing.