在python中实现调度线程

时间:2016-02-17 13:39:09

标签: python multithreading scheduled-tasks scheduling scheduler

我需要以下架构:

scheduling-thread(S):
  - push scheduling event to "schedule" queue, with `data` and a `deadline`

scheduler-thread:
  - forever loop
    - process scheduling events from the "schedule" queue
    - push event to a "deadlines-met" queue when deadline is met

customer-thread(S):
  - listen to "deadlines-met" queue

也就是说,调度程序线程通过“调度”队列从调度线程接收数据,并在满足截止日期时将它们推送到“deadlines-met”队列。

监听“deadlines-met”队列的客户将在所需的时间收到事件。

我担心scheduler-thread的实施可能很复杂,因为它需要做两件事:

  • 收听“日程安排”队列,并准备截止日期
  • 在适当的时刻将事件推送到“deadlines-met”队列

两者都无法在同一时间完成:也就是说,如果我等待截止日期到期,我无法收听新的日程安排事件,如果我正在听,我不能等到截止日期到期

我怎样才能实现这个调度线程?简单的替代方法(sched模块)会在等待截止日期到期时阻塞我的线程,这样我就无法处理新的调度事件。

2 个答案:

答案 0 :(得分:1)

另一种方法是使用优先级队列。

我在Python中没有这样做,但想法是将截止日期排序并等待最短时间。如果你使用condition object,你可以wait()最短,但是当发布另一个事件时,notify()将取消睡眠,并且线程将下一个事件放入已排序列表中再次等待最短的时间。

答案 1 :(得分:0)

在“主”程序中创建队列对象

从“main”程序

启动Threading.thread的两个线程

检查每个线程的队列

您可以阻止从队列中读取,或者您可以睡眠并使用Queue.empty()检查每一秒

请参阅此示例 How to use threading in Python?