Celery Beat方法:如何将group()的返回值组合到字典中

时间:2019-01-25 01:38:21

标签: celery celery-task celerybeat

我正在使用Celery 4.2.0构建抓取工具。我的芹菜节拍脚本beat_test()使用group()方法运行多个任务,在本例中为u_f(),该方法包装了update_forecast()方法。

现在,我想加入u_f的返回参数(每个返回的格式为:{ticker:Forecast}),使用当前的Forecast字典更新这些结果,并将其保存为JSON。

我在beat_test()方法的最后7行尝试过此操作。 group()行当前正在运行,但是该方法的最后七行无法正常工作。我知道这是因为u_f包装的update_forecast保存了一个文件并返回了前面提到的单键字典,该字典在芹菜时间表日志中打印。

我尝试使用'result.join()',但这在@ app.task中是不允许的。是的,我想我需要@ app.task使其成为一种可调度的节拍方法。但这是我对非Django Celery的首次尝试-我不知道。

接下来我应该尝试什么?
我应该采用什么最佳实践吗?

代码:

## Core Python
import json
from datetime import datetime

## Data aquisition methods
from Get_Forecast_Data import update_forecast 

## Celery methods
from celery import Celery
from celery.schedules import crontab
from celery import group


app = Celery("tasks", broker='pyamqp://guest@localhost//')

## Set the timing of beat server tasks
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):

    ## Executes every weekday {M,Tu,W,Th,F} at 3:15 p.m.
    # Use UTC! 15(3PM) + 8hr = 23
    sender.add_periodic_task(
        schedule=crontab(hour='23', minute='15', day_of_week='1-5'),
        sig=beat_test.s(),
        name='Test Update Price Targets',
    )


## Update Forecast - Worker Task
@app.task
def u_f(tickers,):
    return update_forecast(tickers,)


## Test Beat Server Task
@app.task
def beat_test():
    ## Import list of tickers
    with open('tickers_forecast.json') as json_data:
        tickers = json.load(json_data)

    ## Read forecasts.JSON, we'll overwrite values after they update...
    file_name = 'forecasts_test.json'
    with open(file_name) as f:
        forecasts = json.load(f)

    ## Lazy import of stock ticker updates
    result = group(u_f.s(i) for i in tickers)(); # print(str(job) )

    # result.join(); RuntimeError: Never call result.get() within a task!
    print(result)

    ## Overwrite key and value pair for list of ticker,dict(values) pairs
    forecasts.update(dict(result) )

    with open('forecasts_test.json', 'w') as f:
        json.dump(forecasts, f, sort_keys=True, indent=2, separators=(',', ': ') )

    return forecasts

0 个答案:

没有答案