Tôi muốn tạo một nhóm từ danh sách được trả về bởi tác vụ Celery, để cho mỗi mục trong tập kết quả nhiệm vụ, một nhiệm vụ sẽ được thêm vào nhóm.Làm thế nào để chuỗi một nhiệm vụ Celery trả về một danh sách thành một nhóm?
Dưới đây là một ví dụ mã đơn giản để giải thích trường hợp sử dụng. ???
phải là kết quả từ nhiệm vụ trước đó.
@celery.task
def get_list(amount):
# In reality, fetch a list of items from a db
return [i for i in range(amount)]
@celery.task
def process_item(item):
#do stuff
pass
process_list = (get_list.s(10) | group(process_item.s(i) for i in ???))
Tôi có lẽ không tiếp cận này một cách chính xác, nhưng tôi khá chắc chắn nó không phải là an toàn để gọi nhiệm vụ từ bên trong nhiệm vụ:
@celery.task
def process_list():
for i in get_list.delay().get():
process_item.delay(i)
Tôi không cần kết quả từ nhiệm vụ giây .
Thật vậy, hãy * không * gọi nhiệm vụ từ công việc. Điều này sẽ gây ra deadlocks. Giả sử bạn có một công nhân. Bạn gọi nhiệm vụ của bạn, mà ràng buộc công nhân 1, sau đó gọi một nhiệm vụ thứ hai. Không có nhân viên nào để xử lý nhiệm vụ đó và mọi thứ sẽ bị treo. Nastiness này được tốt hơn một chút khi bạn thêm công nhân, nhưng bạn sẽ luôn luôn được buộc lên nhiều công nhân với một nhiệm vụ duy nhất (và mất song song). – mlissner