swoft-cloud / swoft

🚀 PHP Microservice Full Coroutine Framework
https://swoft.org
Apache License 2.0
5.58k stars 786 forks source link

设置task任务,怎么可以主动退出? #240

Closed JamesChengHF closed 6 years ago

JamesChengHF commented 6 years ago

就是之前设置了一个任务,某天不想执行这个任务了或者达到某个触发条件,怎么让他主动退出

stelin commented 6 years ago

你设置一个定时任务吧

JamesChengHF commented 6 years ago

定时任务不还是会在设置的时间内,不停的在执行吗?如果我想主动让他停止,目前有什么方法吗?

dizys commented 6 years ago

一般会在任务内判断是否要需要继续执行下去比较好吧

JamesChengHF commented 6 years ago

任务内判断这个我明白,如果有一个每日执行的定时任务,然后某天不需要了,那怎么把这个任务清除或者退出呢

dizys commented 6 years ago

如果有这种需求那么 就去做标记 定任务的时候生成并记录个task_id并把task_id作为data一部分传入任务。 如果需要取消 在redis中标记一下。 时间到了该执行的时候就去redis查一下。是否有该task_id对应的标记。有标记说不要执行就直接return 不往下执行了。

当然,这是对你手上需求的一个简陋实现方式。事实上,主要原因是swoft或者说swoole并没有提供一个完善的任务队列系统。

Swoft的任务队列是对swoole的task的一个简单包装,实际上并不是一个全面的队列系统,swoole本意是提供一个异步处理耗时任务的接口,而具体的掌控还是需要自己实现。一个全面的队列系统一般都是基于消息队列实现的,任务队列的持久化,失败重试,超时重试,分布式消耗,优先级等等特性在swoole提供的基本构架上还需要完善。

dizys commented 6 years ago

对于一般只做一次的延时任务来说,task较为合适。

而对于反复做的定间隔时间任务来说,很不常见会遇到说这个任务会很容易变化的,所以一般是hard code的cron job(swoft给的英文叫cron task个人认为是不恰当的,task是一项任务,做完就没了,而job是一份工作,今天做这个明天也是做这个),需要取消、更改执行内容,那么去改代码就好了。

JamesChengHF commented 6 years ago

@heikezy 谢了,明白该怎么做了。希望后期提供一个完善的方法