Python - 執行緒排程



Python中的執行緒排程是決定任何給定時間執行哪個執行緒的過程。在多執行緒程式中,多個執行緒獨立執行,允許任務並行執行。但是,Python本身並不直接支援控制執行緒優先順序或排程策略。相反,它依賴於作業系統的執行緒排程程式。

Python執行緒被對映到主機作業系統的原生執行緒,例如類Unix系統上的POSIX執行緒(pthreads)或Windows執行緒。作業系統的排程程式管理這些執行緒的執行,包括上下文切換、執行緒優先順序和排程策略。Python透過threading.Timer類和sched模組提供基本的執行緒排程功能。

本教程將學習Python中執行緒排程的基礎知識,包括如何使用sched模組排程任務以及如何使用threading.Timer類延遲執行函式。

使用Timer類排程執行緒

Python threading模組的Timer類允許您安排一個函式在一段時間後被呼叫。此類是Thread的子類,並用作建立自定義執行緒的示例。

您可以透過呼叫其start()方法啟動計時器,類似於執行緒。如果需要,您可以使用cancel()方法在計時器開始之前停止它。請注意,執行操作之前的實際延遲可能與指定的精確間隔不匹配。

示例

此示例演示如何使用threading.Timer()類來排程和管理在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))

執行上述程式後,將產生以下輸出:

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

使用sched模組排程執行緒

Python標準庫中的sched模組提供了一種排程任務的方法。它實現了一個通用的事件排程程式,用於在特定時間執行任務。它提供了類似於Windows或Linux中任務排程的工具。

sched模組的關鍵類和方法

sched模組中定義的scheduler()類用於建立排程器物件。以下是類的語法:

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

排程器類中定義的方法包括:

  • scheduler.enter(delay, priority, action, argument=(), kwargs={}) - 事件可以安排在延遲後或特定時間執行。要使用延遲安排它們,請使用enter()方法。

  • scheduler.cancel(event) - 從佇列中刪除事件。如果該事件不是當前在佇列中的事件,則此方法將引發ValueError。

  • scheduler.run(blocking=True) - 執行所有已安排的事件。

事件可以安排在延遲後或特定時間執行。要使用延遲安排它們,請使用enter()方法,它接受四個引數。

  • 表示延遲的數字

  • 優先順序值

  • 要呼叫的函式

  • 函式的引數元組

示例

此示例演示如何使用sched模組排程事件以便在延遲後執行。它排程兩個不同的事件:

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))

它將產生以下輸出

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

示例

讓我們來看另一個例子來更好地理解這個概念。此示例使用Python中的sched模組排程一個函式,在4秒延遲後執行加法運算。

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())

它將產生以下輸出

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
廣告