Tôi có đoạn mã sau:Khi sử dụng asyncio, làm thế nào để bạn cho phép tất cả các nhiệm vụ chạy để kết thúc trước khi tắt vòng lặp sự kiện
@asyncio.coroutine
def do_something_periodically():
while True:
asyncio.async(my_expensive_operation())
yield from asyncio.sleep(my_interval)
if shutdown_flag_is_set:
print("Shutting down")
break
tôi chạy chức năng này cho đến khi hoàn tất. Vấn đề xảy ra khi tắt máy được cài đặt - chức năng hoàn thành và mọi tác vụ đang chờ xử lý sẽ không bao giờ chạy. (Bạn thấy đây là lỗi
task: <Task pending coro=<report() running at script.py:33> wait_for=<Future pending cb=[Task._wakeup()]>>
). Làm cách nào để lên lịch tắt máy một cách chính xác?
Để đưa ra một số ngữ cảnh, tôi viết một màn hình hệ thống đọc từ/proc/stat sau mỗi 5 giây, tính toán mức sử dụng CPU trong khoảng thời gian đó, và sau đó gửi kết quả đến máy chủ. Tôi muốn tiếp tục lập kế hoạch cho các công việc giám sát này cho đến khi tôi nhận được sigterm, khi tôi ngừng lập kế hoạch, hãy đợi tất cả các công việc hiện tại để hoàn thành và thoát ra một cách duyên dáng.
để cung cấp cho một số bối cảnh, tôi đang viết một màn hình hệ thống mà đọc từ/proc/stat mỗi 5 giây , tính toán mức sử dụng CPU trong khoảng thời gian đó và sau đó gửi kết quả đến rver. Tôi muốn tiếp tục lập kế hoạch cho các công việc giám sát này cho đến khi tôi nhận được sigterm, khi tôi ngừng lập kế hoạch, hãy đợi tất cả các công việc hiện tại để hoàn thành và thoát ra một cách duyên dáng. – derekdreery
bạn đã thử 'sản lượng từ my_expensive_operation() \ n thu được từ asyncio.sleep (my_interval - timer()% my_interval)' thay thế? – jfs
Tôi chỉ có thể ngủ đủ lâu để tôi biết mọi thứ đã hoàn thành, nhưng điều này không có vẻ rất sạch sẽ. Tôi đã tự hỏi nếu có một cách để lịch trình công việc và sau đó chạy vòng lặp cho đến khi tất cả các nhiệm vụ theo lịch trình được hoàn thành. Trong javascript (node.js), nếu chương trình chính đạt đến kết thúc nhưng có các cuộc gọi lại được thiết lập, thì quá trình này sẽ chạy cho đến khi tất cả các cuộc gọi lại bị xóa. – derekdreery