Python - Thread Scheduling

Lập lịch luồng trong Python là một quá trình quyết định luồng nào sẽ chạy vào bất kỳ thời điểm nào. Trong một chương trình đa luồng, nhiều luồng được thực thi độc lập, cho phép thực hiện song song các tác vụ. Tuy nhiên, Python không có hỗ trợ tích hợp để kiểm soát độ ưu tiên của luồng hoặc chính sách lập lịch trực tiếp. Thay vào đó, nó dựa vào bộ lập lịch luồng của hệ điều hành.

Các luồng Python được ánh xạ tới các luồng gốc của hệ điều hành máy chủ, chẳng hạn như luồng POSIX (pthreads) trên các hệ thống giống Unix hoặc luồng Windows. Bộ lập lịch của hệ điều hành quản lý việc thực thi các luồng này, bao gồm việc chuyển đổi ngữ cảnh, ưu tiên luồng và các chính sách lập lịch. Python cung cấp các khả năng lập lịch luồng cơ bản thông qua lớp threading.Timer và mô-đun sched .

Trong hướng dẫn này, bạn sẽ học những kiến thức cơ bản về lập lịch luồng trong Python, bao gồm cách sử dụng mô-đun sched để lập lịch các tác vụ và lớp threading.Timer cho việc thực thi các hàm với độ trễ.

Scheduling Threads using the Timer Class

Lớp Timer của mô-đun Python threading cho phép bạn lên lịch một hàm được gọi sau một khoảng thời gian nhất định. Lớp này là một lớp con của Thread và là một ví dụ về việc tạo các luồng tùy chỉnh.

Bạn bắt đầu bộ đếm thời gian bằng cách gọi phương thức start() , tương tự như các luồng. Nếu cần, bạn có thể dừng bộ đếm thời gian trước khi nó bắt đầu bằng cách sử dụng phương thức cancel() . Lưu ý rằng độ trễ thực tế trước khi hành động được thực hiện có thể không khớp với khoảng thời gian chính xác đã chỉ định.

Example

Ví dụ này minh họa cách sử dụng lớp threading.Timer() để lên lịch và quản lý việc thực thi các tác vụ (luồng tùy chỉnh) trong Python.

import threading
import time

# Define the event function
def schedule_event(name, start):
   now = time.time()
   elapsed = int(now - start)
   print('Elapsed:', elapsed, 'Name:', name)

# Start time
start = time.time()
print('START:', time.ctime(start))

# Schedule events using Timer
t1 = threading.Timer(3, schedule_event, args=('EVENT_1', start))
t2 = threading.Timer(2, schedule_event, args=('EVENT_2', start))

# Start the timers
t1.start()
t2.start()

t1.join()
t2.join()
# End time
end = time.time()
print('End:', time.ctime(end))

Khi thực thi chương trình trên, nó sẽ tạo ra đầu ra sau:

START: Tue Jul  2 14:46:33 2024
Elapsed: 2 Name: EVENT_2
Elapsed: 3 Name: EVENT_1
End: Tue Jul  2 14:46:36 2024

Scheduling Threads using the sched Module

Mô-đun sched trong thư viện chuẩn của Python cung cấp một cách để lập lịch các tác vụ. Nó triển khai một bộ lập lịch sự kiện tổng quát để chạy các tác vụ vào những thời điểm cụ thể. Nó cung cấp các công cụ tương tự như bộ lập lịch tác vụ trong Windows hoặc Linux.

Key Classes and Methods of the sched Module

Lớp scheduler() được định nghĩa trong mô-đun sched được sử dụng để tạo một đối tượng lập lịch. Dưới đây là cú pháp của lớp −

scheduler(timefunc=time.monotonic, delayfunc=time.sleep)

Các phương thức được định nghĩa trong lớp scheduler bao gồm −

  • scheduler.enter(delay, priority, action, argument=(), kwargs={}) − Các sự kiện có thể được lên lịch để chạy sau một khoảng thời gian trì hoãn, hoặc vào một thời điểm cụ thể. Để lên lịch chúng với một khoảng thời gian trì hoãn, phương thức enter() được sử dụng.

  • scheduler.cancel(event) − Xóa sự kiện khỏi hàng đợi. Nếu sự kiện không phải là sự kiện hiện có trong hàng đợi, phương thức này sẽ phát sinh một ValueError.

  • scheduler.run(blocking=True) − Chạy tất cả các sự kiện đã lên lịch.

Các sự kiện có thể được lên lịch để chạy sau một khoảng thời gian trễ, hoặc vào một thời điểm cụ thể. Để lên lịch cho chúng với một khoảng thời gian trễ, hãy sử dụng phương thức enter(), phương thức này nhận bốn tham số.

  • Một số đại diện cho độ trễ.

  • Giá trị ưu tiên

  • Hàm để gọi

  • Một tuple các đối số cho hàm.

Example

Ví dụ này minh họa cách lên lịch các sự kiện để chạy sau một khoảng thời gian trễ bằng cách sử dụng mô-đun sched . Nó lên lịch cho hai sự kiện khác nhau -

import sched
import time

scheduler = sched.scheduler(time.time, time.sleep)

def schedule_event(name, start):
   now = time.time()
   elapsed = int(now - start)
   print('elapsed=',elapsed, 'name=', name)

start = time.time()
print('START:', time.ctime(start))
scheduler.enter(2, 1, schedule_event, ('EVENT_1', start))
scheduler.enter(5, 1, schedule_event, ('EVENT_2', start))

scheduler.run()

# End time
end = time.time()
print('End:', time.ctime(end))

Nó sẽ tạo ra output

START: Tue Jul  2 15:11:48 2024
elapsed= 2 name= EVENT_1
elapsed= 5 name= EVENT_2
End: Tue Jul  2 15:11:53 2024

Example

Hãy lấy một ví dụ khác để hiểu rõ hơn về khái niệm này. Ví dụ này lên lịch cho một hàm thực hiện phép cộng sau khi trễ 4 giây bằng cách sử dụng mô-đun sched trong Python.

import sched
from datetime import datetime
import time

def addition(a,b):
   print("Performing Addition : ", datetime.now())
   print("Time : ", time.monotonic())
   print("Result {}+{} =".format(a, b), a+b)

s = sched.scheduler()

print("Start Time : ", datetime.now())

event1 = s.enter(4, 1, addition, argument = (5,6))
print("Event Created : ", event1)
s.run()
print("End Time : ", datetime.now())

Nó sẽ tạo ra output

Start Time :  2024-07-02 15:18:27.862524
Event Created :  Event(time=2927111.05638099, priority=1, sequence=0, action=<function addition at 0x7f31f902bd90>, argument=(5, 6), kwargs={})
Performing Addition :  2024-07-02 15:18:31.866381
Time :  2927111.060294749
Result 5+6 = 11
End Time :  2024-07-02 15:18:31.866545