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. 使用Django與芹菜接收未註冊的任務
- 7. 芹菜Redis返回「接收未註冊的任務類型」
- 8. 芹菜隊列似乎沒有註冊我的任務
- 9. 芹菜「收到未註冊任務的類型」
- 10. 芹菜任務
- 11. 芹菜任務
- 12. 芹菜任務沒有在Django數據庫註冊
- 13. 任務狀態和Django的芹菜
- 14. Python芹菜任務的狀態
- 15. 芹菜鏈任務
- 16. 推芹菜任務
- 17. 芹菜動態任務/隱藏在接口後面的芹菜實現
- 18. 芹菜全部生成任務狀態
- 19. 芹菜任務狀態不更新
- 20. 如何獲取芹菜任務狀態?
- 21. 查詢任務狀態 - 芹菜和redis
- 22. 芹菜任務狀態取決於CELERY_TASK_RESULT_EXPIRES
- 23. 芹菜任務的屬性
- 24. 任務中的芹菜任務
- 25. Python芹菜任務重新啓動芹菜工
- 26. 如何務實地用動態輸入安排芹菜任務?
- 27. 芹菜定期任務不啓動
- 28. 在cherrypy中啓動芹菜任務
- 29. 芹菜任務馬上自動發現
- 30. 芹菜任務instanciation緩存