1. Giới thiệu về thư viện schedule
Trong bài giảng này, chúng ta sẽ như những cơ chế đồng hồ thực thụ, học cách chạy các task theo lịch, để code của chúng ta hoạt động đúng vào lúc chúng ta muốn. Sẵn sàng chưa? Hôm nay chúng ta sẽ thuần hóa thời gian!
Thư viện schedule
là một module nhẹ để chạy các hàm theo lịch đã định trước. Nếu code của
bạn cần thực thi theo một lịch trình cụ thể, ví dụ như thu thập dữ liệu mỗi ngày lúc 6 giờ sáng hoặc gửi
các nhắc nhở hàng ngày, thì schedule
chính là điều bạn cần.
Đây là những ưu điểm chính của schedule
:
- Đơn giản: Giao diện trực quan hơn rất nhiều so với các giải pháp mặc định như
cron
haythreading
. - Tối giản: Không có các chức năng dư thừa - chỉ có những gì cần thiết.
- Dễ hiểu: Sử dụng gần như ngôn ngữ tự nhiên để định nghĩa lịch trình.
Cài đặt thư viện
Để bắt đầu, trước tiên chúng ta cần cài đặt thư viện schedule
. Giống như nhiều thư viện
Python khác, bạn có thể sử dụng pip
:
pip install schedule
Bây giờ, khi mọi thứ đã sẵn sàng, hãy bắt đầu khám phá thế giới tự động hóa và xem cách schedule
có
thể thay đổi công việc hàng ngày của bạn.
Các phương thức chính của thư viện schedule
Thư viện schedule
cung cấp các phương thức để thiết lập task theo thời gian và tần suất khác nhau:
every().day.at("HH:MM")
— chạy task mỗi ngày vào một thời gian cụ thể.every().hour
— chạy task mỗi giờ.every().minute
— chạy task mỗi phút.every().week.at("HH:MM")
— chạy task hàng tuần vào thời gian cụ thể.every().monday.at("HH:MM")
— chạy task mỗi thứ Hai vào thời gian cụ thể.every(10).seconds
— chạy task mỗi 10 giây (hoặc bất kỳ khoảng thời gian nào khác).
2. Cài đặt task lặp lại
Bắt đầu với một thứ đơn giản - lên lịch cho một hàm được thực thi mỗi giờ. Chúng ta sẽ tạo một hàm đơn giản, hiển thị một thông báo chào hỏi, và chạy nó theo lịch.
Ví dụ: Chào hỏi mỗi giờ
import schedule
import time
def say_hello():
print("Xin chào! Chúng tôi đang làm việc với tự động hóa giờ.")
# Chạy hàm say_hello mỗi giờ
schedule.every().hour.do(say_hello)
while True:
# Thực hiện tất cả các task đã đến thời gian
schedule.run_pending()
time.sleep(1)
Vậy là xong — script đầu tiên của bạn với schedule
! Trong ví dụ này, chúng ta đã sử dụng phương thức
every().hour.do(say_hello)
để nói "Xin chào!" mỗi giờ. Thật thú vị, phải không?
Lệnh schedule.every().hour.do(say_hello)
không thực thi hàm say_hello
, mà thêm nó vào
lịch trình. Thực thi thực tế của hàm sẽ xảy ra vào lúc nó được định giờ - bằng cách sử dụng mã
schedule.run_pending()
.
3. Cài đặt các khoảng thời gian phức tạp hơn
Giả sử chúng ta muốn chạy task không chỉ mỗi giờ, mà còn, ví dụ, mỗi 10 phút hoặc vào những ngày cụ thể trong
tuần? schedule
hỗ trợ hầu hết các biểu thức thời gian phổ biến, và bạn có thể sử dụng chúng một
cách dễ dàng không kém.
Ví dụ: Chạy task mỗi 10 phút
import schedule
import time
def task():
print("Task này được thực thi mỗi 10 phút.")
# Lên lịch chạy task mỗi 10 phút
schedule.every(10).minutes.do(task)
while True:
schedule.run_pending() # Thực thi tất cả các task đã đến thời gian
time.sleep(1)
Ví dụ: Chạy task vào các ngày cụ thể
Giờ hãy thử lên lịch cho một task chạy vào những ngày cụ thể trong tuần, ví dụ, mỗi thứ Hai và thứ Tư, nhưng chỉ vào lúc 9 giờ sáng.
import schedule
import time
def monday_wednesday_task():
print("Task này được thực thi vào thứ Hai và thứ Tư lúc 9 giờ sáng.")
# Chạy task vào thứ Hai và thứ Tư lúc 9 giờ sáng
schedule.every().monday.at("09:00").do(monday_wednesday_task)
schedule.every().wednesday.at("09:00").do(monday_wednesday_task)
while True:
schedule.run_pending()
time.sleep(1)
Như bạn thấy, schedule
xử lý các biểu thức thời gian khác nhau, bao gồm ngày trong tuần và thời
gian chính xác. Điều này cực kỳ thuận tiện để lên lịch các task đồng bộ hóa với công việc hoặc các sự kiện theo
lịch trình của bạn.
4. Xử lý các task với các điều kiện thời gian khác nhau
Nếu script của bạn thực hiện nhiều task, và mỗi task có lịch trình riêng của nó, schedule
vẫn dễ
dàng xử lý được. Ví dụ, một task có thể chạy mỗi sáng, trong khi task khác chạy mỗi thứ Sáu.
Ví dụ: Kết hợp các task khác nhau trong một script
import schedule
import time
def morning_task():
print("Chào buổi sáng! Đã đến giờ cho task buổi sáng.")
def friday_task():
print("Yeah, thứ Sáu rồi! Đến giờ làm việc với task thứ Sáu.")
# Task buổi sáng mỗi sáng lúc 7:30
schedule.every().day.at("07:30").do(morning_task)
# Task thứ Sáu mỗi thứ Sáu lúc 4:00 chiều
schedule.every().friday.at("16:00").do(friday_task)
while True:
schedule.run_pending()
time.sleep(1)
Lời khuyên thực tế và lỗi thường gặp
Khi nói đến tự động hóa với schedule
, có một vài điểm bạn nên lưu ý.
Đầu tiên, hãy nhớ rằng schedule
chạy task trong luồng chính. Điều này có nghĩa là nếu task của bạn
kéo dài hoặc có thể chặn việc thực thi các task khác, bạn nên xem xét sử dụng đa luồng hoặc gọi đồng bộ cho
task.
Thứ hai, nếu task của bạn cần phải thực thi vào thời gian chính xác và điều này rất quan trọng, hãy đảm bảo thiết
bị của bạn đang bật và script đang chạy. schedule
không hoạt động nếu script bị dừng hoặc
thiết bị bị tắt.
Và cuối cùng, một sự hiểu lầm phổ biến — kỳ vọng rằng schedule
có thể bù đắp cho các task đã bị bỏ
lỡ. Thật không may, nếu script của bạn không chạy khi task cần được thực thi, schedule
sẽ không
thực hiện nó sau đó.
GO TO FULL VERSION