V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jakeyfly
V2EX  ›  问与答

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

  •  
  •   jakeyfly · 2018-03-30 01:12:05 +08:00 · 1820 次点击
    这是一个创建于 2217 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    最简单的办法还是用 scrapy,你需要的功能都有,想怎么控制怎么控制。
    可以学一下,多一点学习时间,就减一点开发时间。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5733 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 02:46 · PVG 10:46 · LAX 19:46 · JFK 22:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.