2017-12-06 2 views
0

셀 콜렉션의 콜백 함수에 추가 인수를 전달해야합니다. (셀러리 버전 : latentcall 4.1.0()와 파이썬 2.7)Celery 코드의 콜백 함수에 추가 인수 전달

는 아래의 샘플 생각해

from tasks import get_stock_info, call_back 
from celery import group, chord 

def chord_queue(): 
    header = (get_stock_info.subtask((delay,)) for delay in [4, 5, 4]) 
    callback = call_back.subtask() 
    header1 = (get_stock_info.subtask((delay,)) for delay in [4, 4, 4]) 
    res = chord(header,queue='susanoo_dev')(callback) 
    res1 = chord(header1,queue='susanoo_core')(callback) 
    print(res.get()) 
    print(res1.get()) 
    print("We are done") 

if __name__ == '__main__': 
    chord_queue() 

tasks.py

program.py을

from pandas_datareader import data 
from celery_app import app 
import time 

@app.task 
def get_stock_info(delay): 
    print('hello Celery--------') 
    time.sleep(delay) 
    print('Whats up') 
    return 10 

@app.task 
def call_back(num): 
    print("Everything is done------") 
    print("Everything is done------") 
    return sum(num) 

celery_ap

from celery import Celery 
from kombu import Queue 

app = Celery('tasks', broker='amqp://my_user:[email protected]/my_vhost', backend='redis://localhost:6379/0') 

CELERY_CONFIG = { 
    'CELERY_DEFAULT_QUEUE': 'default', 
    'CELERY_QUEUES': (Queue('dev'), Queue('core'),) 
} 

app.conf.update(**CELERY_CONFIG) 
화음이 호출되는이 경우에 지금

모든 3 get_stock_info 작업 후 p.py는하려면 call_back가 호출되는, 완료되는 값 , get_stock_info의 반환 값이 자동으로 전달됩니다. 반환 값과 함께 콜백 함수에 "abcd"라는 문자열을 추가 인수로 전달하려고합니다.

어떻게해야합니까?

이미 일부 블로그 제안이 일을 시도/SO있는 등 답변

def chord_queue(): 
    header = (get_stock_info.subtask((delay,)) for delay in [4, 5, 4]) 
    callback = call_back.subtask(kwargs={'my_str' : 'abcd'}) 
    header1 = (get_stock_info.subtask((delay,)) for delay in [4, 4, 4]) 
    res = chord(header,queue='susanoo_dev')(callback) 
    res1 = chord(header1,queue='susanoo_core')(callback) 
    print(res.get()) 
    print(res1.get()) 
    print("We are done") 

tasks.py

@app.task 
def call_back(num, my_str): 
    print("Everything is done------") 
    print("Everything is done------") 
    print my_str 
    return my_str, sum(num) 

그러나이 program.py 작동하지 않는 것으로 보이며 다음 오류가 발생합니다 :

celery.backends.base.ChordError: Callback error: TypeError("call_back() got an unexpected keyword argument 'my_str'",)

답변

0

답을 얻었다. 나를 도와 주신 친구 덕분에. 위의 솔루션에서 잘못 수행 된 모든 것은 call_back()의 정의에서 키워드 인수로 my_str을 정의하지 않는 것이 었습니다.

program.py

def chord_queue(): 
    header = (get_stock_info.subtask((delay,)) for delay in [4, 5, 4]) 
    callback = call_back.subtask(kwargs={'my_str' : 'abcd'}) 
    header1 = (get_stock_info.subtask((delay,)) for delay in [4, 4, 4]) 
    res = chord(header,queue='susanoo_dev')(callback) 
    res1 = chord(header1,queue='susanoo_core')(callback) 
    print(res.get()) 
    print(res1.get()) 
    print("We are done") 

task.py

@app.task 
def call_back(num, my_str=None): 
    print("Everything is done------") 
    print("Everything is done------") 
    print my_str 
    return my_str, sum(num) 

그리고 그것은 어떤 문제없이 예상대로 작동합니다

그래서 작업 솔루션이 될 것입니다.