替代轮询工作计划程序。

| 我们这里需要工作服务器,而我目前正在使用Quartz.net,但是创建自己的想法吸引了我。至少了解Quartz.net在幕后可能会做什么并不会损害我对更有效地使用它的理解/机会。 所以我的问题是,您将如何在不进行轮询的情况下获取和解雇线程上的工作?如果您每2分钟检查一次\'jobstore \',以查找需要解雇的工作,则可能会延迟2分钟。如果减少轮询时间,则会增加作业库的负担,但仍无法获得真正的开始时间。您可以为接下来的两分钟段预加载作业,并在其余时间使线程进入睡眠状态,以便它们在适当的时间启动,但是如果轮询时间长(删除,重新安排等),这似乎很麻烦并且容易出现问题。我正在研究Quartz以弄清楚它是如何做到的,但是我想知道我是否缺少一些基本知识。 编辑: 像Kevin最初描述的那样的线程结构似乎是您应该做作业服务器的方式。它以最小的开销为您提供最大的灵活性。因为线程是大多数人可以使用的皮塔饼(也许就是我:),所以更简单的轮询示例将在90%的情况下完成工作,但会损失灵活性和更多开销。 另一方面,除非您要使它成为单线程并执行一个作业,否则无论如何都要处理该线程。最好也尽力消除野猪的信号。 我也同意凯文(Kevin)的观点,即您在轮询数据库示例中声称免费获得的东西并不是真正免费的。您将像对线程/等待应用程序一样进行编码。如果您的轮询数据库作业服务器在作业过程中崩溃了怎么办?两者都将依靠一些持久存储来在发生灾难时跟踪其状态。 如果将“ jobstore”上移一个抽象级别而不基于正常的ACID(正确的术语)数据库怎么办?现在,我相信您的许多“免费”东西所基于的东西不再可用(交易?)。     
已邀请:
        您将创建按时间顺序(最短到最长的时间)要执行的任务队列。队列的开头将恰好有一个线程在等待时间。在该时间到期后,您将删除该项目并启动任务。如果是重复任务,则重新计算并重新放入队列。 唯一棘手的事情是线程应基于某些条件变量等待。如果队列头更改,则可以发出条件变量的信号。通常使用条件变量,您可以判断它是否已发出信号与超时已过期。因此,如果有信号表明您只是在新的等待时间上等待,否则超时表明是时候在队列的最前面运行任务了。 该解决方案意味着您只有一个线程来管理任务,并且没有轮询。 编辑: 我将更新我的解决方案,以指出编写自定义调度程序可能不是一个好主意,因为石英是一个非常好的解决方案。我还认为,每秒轮询是一种过大的手段,因为作业通常是按分钟运行,而不是每秒运行。例如,您真的在乎工作是从12:00:05开始还是12:00:00足够好?无论如何,您都可以将轮询参数化以满足所需的粒度级别。     

要回复问题请先登录注册