Thuật toán lập lịch tác vụ trong python

Kỹ thuật tiêu chuẩn được sử dụng để lập lịch trình là sử dụng các công việc Cron. Tôi không phản đối việc sử dụng Cron và vẫn cho rằng đó là một cách ổn định.  

Nhưng nếu bạn muốn có một bộ lập lịch hoàn toàn bằng Python thì sao?

Đó là trọng tâm của bài viết này.  

Có liên quan. Cách hoàn hảo để tự động hóa và sắp xếp các đường ống dữ liệu

Lên lịch tác vụ trong Python

Lập lịch tác vụ trong Python được thực hiện dễ dàng với gói python có tên là 'schedule. ’ Bạn có thể cài đặt nó từ kho lưu trữ PyPI.  

$ pip install schedule
# If you're using poetry instead of virtualenv
poetry add schedule

Lịch trình sử dụng mẫu trình tạo quen thuộc. Nó cho phép bạn xây dựng lịch trình gần giống như bạn nói bằng ngôn ngữ tự nhiên. Nghĩa là, nếu bạn muốn chạy một chức năng (chẳng hạn như send_email) mỗi giờ một lần, bạn có thể thực hiện như sau

schedule.every().hour.do(send_email)

Điều đó rất gần với một cuộc trò chuyện bình thường, phải không? .  

import time
import schedule


def send_email():
    # All your email sending logics goes here
    print("Sending email...")


schedule.every().day.at("14:45").do(send_email)

while True:
    schedule.run_pending()
    time.sleep(1)

Đoạn mã trên sẽ gọi hàm send_email lúc 2. 45 PM mỗi giờ hệ thống của bạn.  

Bên cạnh việc dễ dàng lên lịch, gói cung cấp một loạt các tính năng khác.  

Có liên quan. Cách thực thi lệnh shell với Python

Lập kế hoạch với một người trang trí

Tôi có sở thích cá nhân là sử dụng đồ trang trí bất cứ khi nào có thể. Nó sạch hơn và thanh lịch hơn.  

Gói 'lịch trình' hỗ trợ các nhà trang trí ngoài hộp. Đây là ví dụ của chúng tôi về việc gửi email, lần này sử dụng các công cụ trang trí.  

import time
from schedule import repeat, every, run_pending


@repeat(every(10).seconds)
@repeat(every(5).seconds)
def send_email():
    # All your email sending logics goes here
    print("Sending email...")


while True:
    run_pending()
    time.sleep(1)

Trong ví dụ trên, bạn cũng có thể thấy rằng chúng tôi đã thực hiện hai lịch trình cho cùng một nhiệm vụ. Cái đầu tiên sẽ gọi hàm cứ sau 10 giây. Cái thứ hai sẽ gọi nó cứ sau 5 giây.  

Chạy các tác vụ theo lịch trình với các tham số

Lập kế hoạch một mình không phải là rất hữu ích. Chúng ta thường muốn kiểm soát nhiều hơn việc thực thi chức năng. Chúng tôi làm điều đó bằng cách chuyển đối số.  

@repeat(every(10).seconds)
@repeat(every(5).seconds, email="[email protected]")
def send_email(email="[email protected]"):
    # All your email sending logics goes here
    print(f"Sending email...: to {email}")

Như chúng ta thấy, chức năng gửi email của chúng ta có một đối số tùy chọn, email. Khi lên lịch, chúng ta có thể truyền tham số dưới dạng đối số từ khóa.  

Đây chỉ là một vài ví dụ về việc sử dụng thư viện trong Python. Vui lòng tham khảo tài liệu chính thức để biết thêm các ví dụ có giá trị.  

Lên lịch tác vụ với cron tab— cách thông thường

Crontab là kỹ thuật phổ biến nhất để chạy các tác vụ theo lịch trình. Nó nổi tiếng vì một vài lý do.  

Một cái được cung cấp bởi hệ điều hành. Crontab dành cho Linux. Ngay cả người dùng Windows cũng có thể sử dụng Crontab bằng WSL.  

Lý do khác là Crontab độc lập với ngôn ngữ lập trình của tác vụ. Bạn cũng có thể sử dụng kỹ thuật tương tự để chạy tập lệnh node js.  

Trước tiên, chúng tôi cần sửa đổi mã của mình để chạy theo yêu cầu thay vì theo lịch trình vì Crontab sẽ lo việc lập lịch trình.  

import argparse


def send_email(email="[email protected]"):
    # All your email sending logics goes here
    print(f"Sending email...: to {email}")


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--email", help="Email to send")

    args = parser.parse_args()

    if args.email:
        send_email(args.email)
    else:
        send_email()

Tôi đã sử dụng mô-đun argparse trong phiên bản trên để chấp nhận các đối số dòng lệnh. Bạn cũng có thể sử dụng Typer để tạo các CLI nâng cao hơn trong Python.  

Liên kết được Tài trợ

Chúng tôi có thể chạy tập lệnh trên trong thiết bị đầu cuối của mình như sau

$ python send_mail.py -e [email protected]
# OR without any arguments
$ python send_email.py

Chúng ta có thể bắt đầu chỉnh sửa Crontab bằng lệnh sau.  

import time
import schedule


def send_email():
    # All your email sending logics goes here
    print("Sending email...")


schedule.every().day.at("14:45").do(send_email)

while True:
    schedule.run_pending()
    time.sleep(1)
0

Dấu nhắc lệnh sẽ yêu cầu bạn chọn trình chỉnh sửa trong lần chỉnh sửa đầu tiên. Tôi đã chọn vim vì nó thoải mái với tôi. Nhưng bạn có thể chọn bất cứ thứ gì.  

Tôi đã thêm dòng sau vào cuối tệp.  

import time
import schedule


def send_email():
    # All your email sending logics goes here
    print("Sending email...")


schedule.every().day.at("14:45").do(send_email)

while True:
    schedule.run_pending()
    time.sleep(1)
1

Liên kết được Tài trợ

Cấu hình này yêu cầu Crontab chạy tập lệnh

import time
import schedule


def send_email():
    # All your email sending logics goes here
    print("Sending email...")


schedule.every().day.at("14:45").do(send_email)

while True:
    schedule.run_pending()
    time.sleep(1)
0 lúc 2. 45h hàng ngày. Lưu nó và đóng tập tin. Tập lệnh của bạn sẽ chạy như mong đợi.  

Nếu bạn không rõ về cấu hình crontab, lời khuyên tốt nhất của tôi là sử dụng Crontab. đạo sư.  

Lịch trình Crontab hoặc Python?

Cả hai công cụ đều tuyệt vời để lên lịch các tác vụ. Nhưng tùy thuộc vào hoàn cảnh, cái này hoạt động tốt hơn cái kia.  

Điểm cộng của lịch trình Python là tính linh hoạt và thân thiện. Bất cứ ai cũng có thể hiểu lịch trình chỉ bằng cách đọc nó. Bạn thậm chí không cần phải tham khảo tài liệu.  

Mặc dù cấu hình crontab không khó hiểu nhưng người mới bắt đầu sẽ cần một chút nỗ lực để hiểu chúng.  

Mọi thứ đều ở một nơi, giúp thư viện lịch trình trở nên đơn giản. Trong Crontab, bạn phải chỉnh sửa tệp cấu hình bên ngoài mô-đun đang phát triển của mình. Nếu ai đó muốn sử dụng ứng dụng của bạn, bạn phải hướng dẫn họ.  

Ngoài ra, nếu tôi muốn tạo một lịch trình mới, tất cả những gì tôi phải làm là chú thích chức năng này với một chức năng khác.

import time
import schedule


def send_email():
    # All your email sending logics goes here
    print("Sending email...")


schedule.every().day.at("14:45").do(send_email)

while True:
    schedule.run_pending()
    time.sleep(1)
1. Ngoài ra, trong Crontab, bạn sẽ thêm một dòng cấu hình khác. Nhưng không nhanh như bạn làm trong tập lệnh Python

Những ưu điểm này làm cho thư viện lịch biểu của Python phù hợp với hầu hết các trường hợp sử dụng. Nhưng hãy xem trang tài liệu của thư viện.  

Thư viện này được thiết kế để trở thành một giải pháp đơn giản cho các vấn đề lập lịch trình đơn giản. Có lẽ bạn nên tìm một nơi khác nếu bạn cần ghi nhớ lịch trình giữa các lần khởi động lại, thực thi chính xác dưới giây, hỗ trợ nhiều luồng, múi giờ, ngày làm việc hoặc ngày lễ. — lập lịch thư viện tài liệu

Suy nghĩ cuối cùng

Chạy các tác vụ theo lịch trình là một nhu cầu thường xuyên trong phát triển phần mềm. Tôi thường thấy hữu ích khi chạy các thủ thuật nhỏ hiệu quả mà tôi thực hiện khi đang di chuyển.  

Tôi đã sử dụng Crontab được vài năm, nghĩ rằng đó là cách duy nhất để thực hiện công việc. Nhưng lịch trình thư viện Python làm cho nó trở nên cực kỳ đơn giản.  

Liên kết được Tài trợ

Nó có thể không phải là công cụ hoàn hảo cho mọi trường hợp. Nhưng không phải mọi thứ chúng ta làm hàng ngày đều cần những kỹ thuật phức tạp hơn.  

Thuật toán nào được sử dụng cho nhiệm vụ?

Thuật toán heuristic để phân công và lập lịch tác vụ trong mạng bộ xử lý.

Lập lịch tác vụ với một ví dụ là gì?

Trình lập lịch tác vụ là một công cụ đi kèm với Windows cho phép tự động thực hiện các hành động được xác định trước bất cứ khi nào một nhóm điều kiện nhất định được đáp ứng . Ví dụ: bạn có thể lên lịch cho một tác vụ để chạy tập lệnh sao lưu mỗi đêm hoặc gửi e-mail cho bạn bất cứ khi nào một sự kiện hệ thống nhất định xảy ra.

Lập kế hoạch nhiệm vụ là gì?

Giới thiệu về Trình lập lịch tác vụ . Trình lập lịch tác vụ thực hiện điều này bằng cách theo dõi bất kỳ tiêu chí nào bạn chọn (được gọi là trình kích hoạt) và sau đó thực hiện các tác vụ khi các tiêu chí đó được đáp ứng. enables you to automatically perform routine tasks on a chosen computer. Task Scheduler does this by monitoring whatever criteria you choose (referred to as triggers) and then executing the tasks when those criteria are met.

Lịch biểu Python hoạt động như thế nào?

Mô-đun đã lên lịch triển khai một bộ lập lịch sự kiện chung để chạy các tác vụ vào những thời điểm cụ thể. Lớp lập lịch sử dụng hàm thời gian để tìm hiểu thời gian hiện tại và hàm trì hoãn để đợi trong một khoảng thời gian cụ thể .