การสร้างAsyncResultอ็อบเจกต์จาก id งานเป็นวิธีที่แนะนำในFAQเพื่อรับสถานะงานเมื่อสิ่งเดียวที่คุณมีคือ id งาน
อย่างไรก็ตามสำหรับคื่นฉ่าย 3.x มีข้อแม้ที่สำคัญที่สามารถกัดคนได้หากพวกเขาไม่ใส่ใจกับพวกเขา มันขึ้นอยู่กับสถานการณ์การใช้งานที่เฉพาะเจาะจง
ตามค่าเริ่มต้น Celery จะไม่บันทึกสถานะ "กำลังทำงาน"
เพื่อให้คื่นฉ่ายจะบันทึกว่างานกำลังทำงานคุณต้องตั้งค่าการtask_track_started Trueนี่คืองานง่ายๆที่ทดสอบสิ่งนี้:
@app.task(bind=True)
def test(self):
print self.AsyncResult(self.request.id).state
เมื่อtask_track_startedใดFalseซึ่งเป็นค่าเริ่มต้นการแสดงสถานะคือPENDINGแม้ว่างานจะเริ่มแล้ว หากคุณตั้งtask_track_startedไปแล้วรัฐจะTrueSTARTED
รัฐPENDINGแปลว่า "ไม่รู้"
AsyncResultกับรัฐPENDINGได้ทำอะไรเลยไม่ได้หมายความว่ามากกว่านั้นคื่นฉ่ายไม่ทราบสถานะของงาน อาจเป็นเพราะสาเหตุหลายประการ
ประการหนึ่งAsyncResultสามารถสร้างด้วยรหัสงานที่ไม่ถูกต้อง "งาน" ดังกล่าวจะถือว่าขึ้นฉ่าย:
>>> task.AsyncResult("invalid").status
'PENDING'
ตกลงดังนั้นไม่มีใครจะไปกินอาหารอย่างเห็นได้ชัดAsyncResultไม่ถูกต้องรหัสไป พอเป็นธรรม แต่ก็ยังมีผลกระทบที่AsyncResultจะพิจารณางานที่มีการทำงานประสบความสำเร็จ PENDINGแต่ที่คื่นฉ่ายได้ลืมความเป็นอยู่ อีกครั้งในสถานการณ์การใช้งานบางกรณีอาจเป็นปัญหาได้ ส่วนหนึ่งของปัญหาขึ้นอยู่กับวิธีกำหนดค่า Celery ให้เก็บผลลัพธ์ของงานไว้เนื่องจากขึ้นอยู่กับความพร้อมของ "tombstones" ในแบ็กเอนด์ของผลลัพธ์ ( "Tombstones" คือการใช้คำในเอกสารคื่นฉ่ายสำหรับชิ้นข้อมูลที่บันทึกว่างานสิ้นสุด.) การใช้AsyncResultจะไม่ทำงานเลยถ้ามีtask_ignore_result Trueปัญหาที่น่าวิตกกว่าคือคื่นฉ่ายจะหมดอายุหลุมฝังศพตามค่าเริ่มต้น result_expiresการตั้งค่าโดยค่าเริ่มต้นตั้งไว้ที่ 24 ชั่วโมง ดังนั้นถ้าคุณเปิดงานและบันทึกรหัสในการจัดเก็บระยะยาว, และอื่น ๆ อีก 24 ชั่วโมงต่อมาคุณสร้างกับมันสถานะจะเป็นAsyncResultPENDING
"งานจริง" ทั้งหมดเริ่มต้นในPENDINGสถานะ ดังนั้นการPENDINGทำงานอาจหมายความว่ามีการร้องของาน แต่ไม่ก้าวหน้าไปกว่านี้ (ไม่ว่าด้วยเหตุผลใดก็ตาม) หรืออาจหมายถึงงานกำลังดำเนินไป แต่คื่นช่ายลืมสถานะของมัน
อุ๊ย! AsyncResultจะไม่ทำงานสำหรับฉัน ฉันจะทำอะไรได้อีก?
ฉันชอบที่จะติดตามเป้าหมายกว่าติดตามของงานตัวเอง ฉันเก็บข้อมูลงานบางอย่างไว้ แต่เป็นเรื่องรองในการติดตามเป้าหมาย เป้าหมายจะถูกเก็บไว้ในที่จัดเก็บโดยไม่ขึ้นกับขึ้นฉ่าย เมื่อคำขอจำเป็นต้องทำการคำนวณขึ้นอยู่กับเป้าหมายบางอย่างที่บรรลุเป้าหมายแล้วจะตรวจสอบว่าบรรลุเป้าหมายแล้วหรือไม่หากใช่จากนั้นจะใช้เป้าหมายที่เก็บไว้นี้มิฉะนั้นจะเริ่มงานที่จะส่งผลต่อเป้าหมายและส่งไปยัง ไคลเอ็นต์ที่ทำการร้องขอ HTTP เป็นการตอบสนองที่บ่งชี้ว่าควรรอผลลัพธ์
ชื่อตัวแปรและการเชื่อมโยงหลายมิติด้านบนใช้สำหรับ Celery 4.x. ใน 3.x CELERY_TRACK_STARTEDตัวแปรที่สอดคล้องและเชื่อมโยงหลายมิติคือ: CELERY_IGNORE_RESULT, CELERY_TASK_RESULT_EXPIRES,
xล่ะ?