V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
5TuNan
V2EX  ›  Python

Python 实现延时任务

  •  1
     
  •   5TuNan · 2020-03-19 17:20:54 +08:00 · 5728 次点击
    这是一个创建于 1708 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,现有一个需求创建一个资源,如果该资源创建成功,5 分钟后对这个资源做一定的操作。请问使用 Python 如何实现。

    25 条回复    2022-01-28 15:13:19 +08:00
    DoubleShut
        1
    DoubleShut  
       2020-03-19 17:25:28 +08:00
    建议不要自己实现,可以用专业的队列,比如 rabbitmq,可以通过投递消息,设置消息过期时间,死信交换机,然后消费死信
    2kCS5c0b0ITXE5k2
        2
    2kCS5c0b0ITXE5k2  
       2020-03-19 17:27:17 +08:00
    还是上专业的消息队列吧,...
    Orenoid
        3
    Orenoid  
       2020-03-19 17:27:24 +08:00
    celery
    qile1
        4
    qile1  
       2020-03-19 17:27:52 +08:00 via Android
    做一个操作是外部调用吗?内部能不能 time。sleep 五分钟然后执行,进程和线程通信就那几种方法
    wzwwzw
        5
    wzwwzw  
       2020-03-19 17:34:09 +08:00
    celery 可以延迟执行吧,这个是简单的实现方式。
    sujin190
        6
    sujin190  
       2020-03-19 17:45:38 +08:00
    https://github.com/snower/forsun

    之前做过一个服务,高性能,用资源 ID 创建任务,到时发起动作,可以是 shell、http 请求、mysql 语句、redis 命令,可以使用 redis 持久化存储,不拍丢失,特别适合订单超时支付取消、配送订单超时之类的人物

    当然也可也自己编写执行器扩展接入自己的项目里
    Feedline
        7
    Feedline  
       2020-03-19 18:41:32 +08:00
    用 redis 吧,轻量级,快速
    hmxxmh
        8
    hmxxmh  
       2020-03-19 18:45:56 +08:00 via Android   ❤️ 1
    用 Apscheduler,python 的异步任务调度框架
    Leigg
        9
    Leigg  
       2020-03-19 18:55:15 +08:00 via Android
    不就是定时任务吗,找找对应方案
    renyijiu
        10
    renyijiu  
       2020-03-19 18:59:22 +08:00   ❤️ 1
    1. 简单的,落库,定时查询;
    2. redis 的 zset,定时查询
    3. 支持延时任务的消息队列

    常见的几个方案
    blackcurrant
        11
    blackcurrant  
       2020-03-19 19:04:18 +08:00 via iPhone
    time.sleep(300)
    do()
    zhoudaiyu
        12
    zhoudaiyu  
       2020-03-19 20:21:49 +08:00 via iPhone
    Celery 干就完了
    Tink
        13
    Tink  
       2020-03-19 21:56:02 +08:00 via iPhone
    sleep 一把梭
    Hello0World
        14
    Hello0World  
       2020-03-19 22:11:27 +08:00 via Android
    celery
    lithbitren
        15
    lithbitren  
       2020-03-19 22:30:32 +08:00
    非阻塞的等待,如果不想借助第三方库,最起码也得开个新进程独立等待。
    Maboroshii
        16
    Maboroshii  
       2020-03-19 23:41:09 +08:00
    循环检查任务是否可以执行
    labulaka521
        17
    labulaka521  
       2020-03-19 23:49:35 +08:00 via Android
    time.sleep 300
    LengthMin
        18
    LengthMin  
       2020-03-19 23:51:02 +08:00
    https://github.com/agronholm/apscheduler
    Advanced Python Scheduler

    https://github.com/coleifer/huey
    huey, a little task queue for python
    cz5424
        19
    cz5424  
       2020-03-20 00:39:45 +08:00 via iPhone
    最简单就是 sleep 啦
    euph
        20
    euph  
       2020-03-20 00:49:55 +08:00
    所以小白首先想到的就算 sleep 吗?第一次见各位大神各种骚操作
    linvaux
        21
    linvaux  
       2020-03-20 09:37:12 +08:00
    celery 了解一下
    Dustyposa
        22
    Dustyposa  
       2020-03-20 10:26:33 +08:00   ❤️ 1
    任务简单的话 可以上原生简单的调度库
    sched

    https://docs.python.org/zh-cn/3/library/sched.html?highlight=sched
    coderEOS
        23
    coderEOS  
       2020-03-20 11:00:43 +08:00
    crontab 1 分一次 + 然后存个文件列表 也可以
    lithbitren
        24
    lithbitren  
       2020-03-22 02:26:55 +08:00
    我佛了,复习了一下文档,直接 threading.Timer 创建任务再 start 就完事了,最直接简单,线程级异步非阻塞,主进程主线程干啥都不影响,时间一到就会开始响应,不怕影响 gil 不开新进程也无妨。


    https://docs.python.org/zh-cn/3/library/threading.html#timer-objects
    Pegasus
        25
    Pegasus  
       2022-01-28 15:13:19 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5342 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:48 · PVG 15:48 · LAX 23:48 · JFK 02:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.