Python實現投遞多執行緒任務

只想安静的搬砖發表於2024-06-07

使用Python的apscheduler庫中的BackgroundScheduler實現投遞多執行緒任務的示例程式碼。這個示例將展示如何根據任務ID投遞和停止任務,設定任務同時執行的上限,以及刪除全部任務。

首先,確保你已經安裝了apscheduler庫:
``
pip install apscheduler

``

程式碼示例:
``
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.executors.pool import ThreadPoolExecutor
from apscheduler.jobstores.memory import MemoryJobStore
import time

    # 定義任務函式
    def my_task(task_id):
        print(f"任務 {task_id} 正在執行")
        time.sleep(5)  # 模擬任務執行需要一些時間
        print(f"任務 {task_id} 完成")

    # 初始化排程器
    jobstores = {
        'default': MemoryJobStore()
    }
    executors = {
        'default': ThreadPoolExecutor(2)  # 設定任務同時執行上限為2
    }
    job_defaults = {
        'coalesce': False,  # 設定任務上限時不合並
        'max_instances': 2  # 每個任務的最大例項數為2
    }

    scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults)
    scheduler.start()

    # 根據任務ID新增任務
    def add_task(task_id):
        scheduler.add_job(my_task, 'interval', seconds=10, id=task_id, args=[task_id])
        print(f"任務 {task_id} 已新增")

    # 根據任務ID停止任務
    def stop_task(task_id):
        scheduler.remove_job(task_id)
        print(f"任務 {task_id} 已停止")

    # 刪除全部任務
    def remove_all_tasks():
        scheduler.remove_all_jobs()
        print("所有任務已刪除")

    # 示例使用
    if __name__ == "__main__":
        # 新增任務
        add_task('task1')
        add_task('task2')

        # 等待一段時間,讓任務執行幾次
        time.sleep(30)

        # 停止任務
        stop_task('task1')

        # 等待一段時間,觀察任務2繼續執行
        time.sleep(20)

        # 刪除所有任務
        remove_all_tasks()

        # 等待排程器關閉
        scheduler.shutdown()
        print("排程器已關閉")

``

注意事項
任務上限設定:透過設定executors中的ThreadPoolExecutor來限制同時執行的任務數量。這裡設定為2。
任務合併(coalesce):設定job_defaults中的coalesce為False,表示當任務積壓時不合並執行。
任務例項限制:設定job_defaults中的max_instances為2,表示每個任務的最大例項數為2。
任務ID:確保任務ID唯一,以便正確管理任務的啟動和停止。
透過以上示例程式碼和解釋,你可以瞭解如何使用BackgroundScheduler實現多執行緒任務的投遞、停止和管理。

相關文章