我正在使用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