有什么通用的解决方案可以存储和重用芹菜任务结果,而无需再次执行任务?我在metasearch项目中有许多http提取任务,并希望通过存储第一个请求的结果并回发而不进行真正的提取来减少无用的http请求的数量(它们可能花费很长时间并返回相同的结果).同样,如果一个新的提取任务正在进行中,则不启动它也将非常有用.无需运行新的作业应用程序,而必须通过已挂起任务的ID(由任务调用args生成并由其ID)返回AsyncResult.
看起来我需要为具有相同task_id的任务定义新的apply_async(Celery.send_task)行为:
>如果具有给定task_id的任务尚未启动,则将其启动
>如果具有给定task_id的任务已经开始返回AsyncResult(task_id)而没有实际运行任务
> @任务装饰器应该接受新的ttl
kwarg确定缓存时间(仅用于redis后端吗?)
解决方法:
看起来最简单的答案是将结果存储在缓存(如数据库)中,然后首先从缓存中请求结果,否则触发http请求.
我认为芹菜没有什么可以做到的.
编辑:
为了符合您在同一时间发送任务的事实,另一件事是为芹菜任务建立一个锁(请参见Celery Task Lock receipt).
在您的情况下,您想给锁一个包含任务名称和URL名称的名称.如果所有工作人员都可以看到,则可以使用任何想要的缓存系统(在您的情况下为Redis?)
标签:celery,python 来源: https://codeday.me/bug/20191120/2047398.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。