2
A
回答
2
我已经完成的方式来安排是基于与“click package has with custom subcommands”具有相同想法的“插件”概念。
该应用结构(基于蟒3):
.
├── dynamic_tasks.py
├── run.py
└── tasks
└── get_rate.py
芹菜任务dynamic_tasks.py被定义为以下:
import os
import celery
app = celery.Celery('dynamic_tasks', broker='amqp://[email protected]/', backend='rpc://')
PLUGIN_FOLDER = os.path.join(os.path.dirname(__file__), 'tasks')
def _absolutepath(filename):
""" Return the absolute path to the filename"""
return os.path.join(PLUGIN_FOLDER, filename)
@app.task
def tasks(funcname, *args, **kwargs):
try:
funcname = funcname.replace('-', '_')
funcname += '.py'
func = _absolutepath(funcname)
ns = {}
with open(func) as f:
code = compile(f.read(), func, 'exec')
eval(code, ns, ns)
return ns['task'](*args, **kwargs)
except IOError as e:
# Manage IOError
raise e
的可插拔任务示例任务/get_rate.py:
""" This task get the currency rate between a pair of currencies """
import urllib.request
URL = 'http://finance.yahoo.com/d/quotes.csv?s={}=X&f=p'
def task(pair='EURSEK', url_tmplt=URL):
with urllib.request.urlopen(url_tmplt.format(pair)) as res:
body = res.read()
return (pair, float(body.strip()))
而且,简单地说,从run.py运行示例:
from dynamic_tasks import tasks
print(tasks.delay('get_rate', 'EURSEK').get())
EDITED 既然型动物的机器上运行芹菜,不可能依靠本地文件系统。我的新方法是发送函数作为字符串执行:
@app.task
def dynamic_tasks(funcname, funccode, *args, **kwargs):
try:
ns = {}
code = compile(funccode, funcname, 'exec')
eval(code, ns, ns)
logger.info('execute %r with args %r, %r', funcname, args, kwargs)
return ns['task'](*args, **kwargs)
except IOError:
logger.error("Error loading the dynamic function from text %s", funcname)
相关问题
- 1. 芹菜“收到未注册的任务”
- 2. 芹菜获取注册任务列表
- 3. Django 1.9 +芹菜未注册任务
- 4. 芹菜任务注册并在本地运行良好 - 切换到EC2和芹菜不注册他们
- 5. 芹菜队列似乎没有注册我的任务
- 6. 芹菜Redis返回“接收未注册的任务类型”
- 7. 芹菜任务没有在Django数据库注册
- 8. 任务状态和Django的芹菜
- 9. 芹菜链任务
- 10. 查询任务状态 - 芹菜和redis
- 11. 如何获取芹菜任务状态?
- 12. 芹菜任务状态不更新
- 13. 如何务实地用动态输入安排芹菜任务?
- 14. 在cherrypy中启动芹菜任务
- 15. 芹菜任务马上自动发现
- 16. 芹菜定期任务不启动
- 17. 关掉芹菜任务
- 18. 芹菜任务不工作
- 19. 去抖芹菜任务?
- 20. 芹菜任务剖析
- 21. 芹菜任务instanciation缓存
- 22. 芹菜任务计划
- 23. 芹菜任务优先级
- 24. 芹菜任务翻译
- 25. 如何从先前的芹菜任务中产生芹菜任务?
- 26. 执行其他芹菜任务不工作的芹菜周期性任务
- 27. 如何动态地添加/删除定期任务,芹菜(celerybeat)
- 28. 如何在Django中跨应用程序/项目注册芹菜任务?
- 29. 芹菜Django没有注册任务,在shell中找不到模块错误
- 30. 芹菜任务计划(芹菜,Django和RabbitMQ)