การสร้าง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
ไปแล้วรัฐจะTrue
STARTED
รัฐPENDING
แปลว่า "ไม่รู้"
AsyncResult
กับรัฐPENDING
ได้ทำอะไรเลยไม่ได้หมายความว่ามากกว่านั้นคื่นฉ่ายไม่ทราบสถานะของงาน อาจเป็นเพราะสาเหตุหลายประการ
ประการหนึ่งAsyncResult
สามารถสร้างด้วยรหัสงานที่ไม่ถูกต้อง "งาน" ดังกล่าวจะถือว่าขึ้นฉ่าย:
>>> task.AsyncResult("invalid").status
'PENDING'
ตกลงดังนั้นไม่มีใครจะไปกินอาหารอย่างเห็นได้ชัดAsyncResult
ไม่ถูกต้องรหัสไป พอเป็นธรรม แต่ก็ยังมีผลกระทบที่AsyncResult
จะพิจารณางานที่มีการทำงานประสบความสำเร็จ PENDING
แต่ที่คื่นฉ่ายได้ลืมความเป็นอยู่ อีกครั้งในสถานการณ์การใช้งานบางกรณีอาจเป็นปัญหาได้ ส่วนหนึ่งของปัญหาขึ้นอยู่กับวิธีกำหนดค่า Celery ให้เก็บผลลัพธ์ของงานไว้เนื่องจากขึ้นอยู่กับความพร้อมของ "tombstones" ในแบ็กเอนด์ของผลลัพธ์ ( "Tombstones" คือการใช้คำในเอกสารคื่นฉ่ายสำหรับชิ้นข้อมูลที่บันทึกว่างานสิ้นสุด.) การใช้AsyncResult
จะไม่ทำงานเลยถ้ามีtask_ignore_result
True
ปัญหาที่น่าวิตกกว่าคือคื่นฉ่ายจะหมดอายุหลุมฝังศพตามค่าเริ่มต้น result_expires
การตั้งค่าโดยค่าเริ่มต้นตั้งไว้ที่ 24 ชั่วโมง ดังนั้นถ้าคุณเปิดงานและบันทึกรหัสในการจัดเก็บระยะยาว, และอื่น ๆ อีก 24 ชั่วโมงต่อมาคุณสร้างกับมันสถานะจะเป็นAsyncResult
PENDING
"งานจริง" ทั้งหมดเริ่มต้นในPENDING
สถานะ ดังนั้นการPENDING
ทำงานอาจหมายความว่ามีการร้องของาน แต่ไม่ก้าวหน้าไปกว่านี้ (ไม่ว่าด้วยเหตุผลใดก็ตาม) หรืออาจหมายถึงงานกำลังดำเนินไป แต่คื่นช่ายลืมสถานะของมัน
อุ๊ย! AsyncResult
จะไม่ทำงานสำหรับฉัน ฉันจะทำอะไรได้อีก?
ฉันชอบที่จะติดตามเป้าหมายกว่าติดตามของงานตัวเอง ฉันเก็บข้อมูลงานบางอย่างไว้ แต่เป็นเรื่องรองในการติดตามเป้าหมาย เป้าหมายจะถูกเก็บไว้ในที่จัดเก็บโดยไม่ขึ้นกับขึ้นฉ่าย เมื่อคำขอจำเป็นต้องทำการคำนวณขึ้นอยู่กับเป้าหมายบางอย่างที่บรรลุเป้าหมายแล้วจะตรวจสอบว่าบรรลุเป้าหมายแล้วหรือไม่หากใช่จากนั้นจะใช้เป้าหมายที่เก็บไว้นี้มิฉะนั้นจะเริ่มงานที่จะส่งผลต่อเป้าหมายและส่งไปยัง ไคลเอ็นต์ที่ทำการร้องขอ HTTP เป็นการตอบสนองที่บ่งชี้ว่าควรรอผลลัพธ์
ชื่อตัวแปรและการเชื่อมโยงหลายมิติด้านบนใช้สำหรับ Celery 4.x. ใน 3.x CELERY_TRACK_STARTED
ตัวแปรที่สอดคล้องและเชื่อมโยงหลายมิติคือ: CELERY_IGNORE_RESULT
, CELERY_TASK_RESULT_EXPIRES
,
x
ล่ะ?