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ễ.
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.
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
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.
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.
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
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