demo_gcTask.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. # import asyncio
  2. # import os
  3. # import tempfile
  4. # import functools
  5. #
  6. # _background_tasks: set[asyncio.Task] = set()
  7. #
  8. # async def _mark_review_failed(review_id, msg):
  9. # print(f" [DB] 写入失败状态 → review_id={review_id}, msg={msg}")
  10. #
  11. # review_id = "R-001"
  12. # tmp_path = os.path.join(tempfile.gettempdir(), f"{review_id}_upload.pdf")
  13. # print(f'tmp_path={tmp_path}')
  14. # file_bytes = b"fake pdf content"
  15. # with open(tmp_path, "wb") as f:
  16. # f.write(file_bytes)
  17. # print(f" [准备] 临时文件已创建: {tmp_path}")
  18. # def _on_task_done(t: asyncio.Task):
  19. # _background_tasks.discard(t)
  20. #
  21. # if os.path.exists(tmp_path):
  22. # os.remove(tmp_path)
  23. # print(f" [清理] 临时文件已删除: {tmp_path}")
  24. #
  25. # mark_failed_msg = None
  26. #
  27. # if t.cancelled():
  28. # mark_failed_msg = "审查任务被服务重启中断,请重试。"
  29. # print(f" [回调] 任务被取消")
  30. # else:
  31. # exc = t.exception()
  32. # if exc:
  33. # mark_failed_msg = f"审查任务执行失败:{exc}"
  34. # print(f" [回调] 任务抛出异常: {exc}")
  35. # else:
  36. # print(f" [回调] 任务正常完成,结果: {t.result()}")
  37. #
  38. # if mark_failed_msg:
  39. # try:
  40. # loop = asyncio.get_running_loop()
  41. # loop.create_task(_mark_review_failed(review_id, mark_failed_msg))
  42. # except RuntimeError:
  43. # pass
  44. #
  45. # async def task_success():
  46. # await asyncio.sleep(0.1)
  47. # return "审查结果:资质评分 85 分"
  48. #
  49. # async def task_exception():
  50. # await asyncio.sleep(0.1)
  51. # raise ValueError("PDF 解析失败,文件损坏")
  52. #
  53. # async def task_cancel():
  54. # await asyncio.sleep(10)
  55. # return "不会跑到这里"
  56. #
  57. #
  58. # async def main():
  59. # # ── 情况1:正常完成 ──
  60. # # print("=" * 40)
  61. # # print("【情况1】正常完成")
  62. # # t1 = asyncio.create_task(task_success())
  63. # # _background_tasks.add(t1)
  64. # # t1.add_done_callback(_on_task_done)
  65. # # await asyncio.sleep(0.5)
  66. #
  67. # # # ── 情况2:任务抛异常 ──
  68. # # print("=" * 40)
  69. # # print("【情况2】任务抛出异常")
  70. # # t2 = asyncio.create_task(task_exception())
  71. # # _background_tasks.add(t2)
  72. # # t2.add_done_callback(_on_task_done)
  73. # # await asyncio.sleep(0.5)
  74. # #
  75. # # # ── 情况3:任务被取消 ──
  76. # print("=" * 40)
  77. # print("【情况3】任务被取消")
  78. # t3 = asyncio.create_task(task_cancel())
  79. # _background_tasks.add(t3)
  80. # t3.add_done_callback(_on_task_done)
  81. # await asyncio.sleep(0.1)
  82. # t3.cancel()
  83. # await asyncio.sleep(0.5)
  84. # #
  85. # print("=" * 40)
  86. # print("剩余后台任务数:", len(_background_tasks))
  87. #
  88. # asyncio.run(main())
  89. import asyncio
  90. _background_tasks: set[asyncio.Task] = set()
  91. # 模拟耗时的后台任务(比如评分投标文件)
  92. async def grade_bid_review(bid_review_id: str):
  93. print(f" [后台] 开始评分 {bid_review_id}...")
  94. await asyncio.sleep(3) # 模拟耗时3秒
  95. print(f" [后台] {bid_review_id} 评分完成!")
  96. # 协程函数:立即返回,后台默默跑
  97. async def submit_bid_review(bid_review_id: str) -> dict:
  98. task = asyncio.create_task(grade_bid_review(bid_review_id))
  99. _background_tasks.add(task)
  100. task.add_done_callback(_background_tasks.discard)
  101. return {"bid_review_id": bid_review_id, "status": "processing", "message": "已提交,正在后台评分"}
  102. async def main():
  103. print("【提交投标文件】")
  104. result = await submit_bid_review("EX-001")
  105. # 立即拿到返回值,后台任务还在跑
  106. print(f"【立即返回】{result}")
  107. print(f"【此刻后台任务数】{len(_background_tasks)}")
  108. print("【主流程继续做其他事情...】")
  109. await asyncio.sleep(4) # 等后台跑完
  110. print(f"【最终后台任务数】{len(_background_tasks)}")
  111. asyncio.run(main())