runner.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. use crate::services::tasks::scheduler::GridTaskScheduler;
  2. use std::sync::Arc;
  3. use std::time::Duration;
  4. use tokio::sync::{watch, RwLock};
  5. use tokio::time::interval;
  6. pub struct GridTaskRunner {
  7. scheduler: Arc<RwLock<GridTaskScheduler>>,
  8. debounce_duration: Duration,
  9. notifier: Option<watch::Receiver<bool>>,
  10. }
  11. impl GridTaskRunner {
  12. pub fn new(
  13. scheduler: Arc<RwLock<GridTaskScheduler>>,
  14. notifier: watch::Receiver<bool>,
  15. debounce_duration: Duration,
  16. ) -> Self {
  17. Self {
  18. scheduler,
  19. debounce_duration,
  20. notifier: Some(notifier),
  21. }
  22. }
  23. pub async fn run(mut self) {
  24. let mut notifier = self
  25. .notifier
  26. .take()
  27. .expect("The GridTaskRunner's notifier should only take once");
  28. loop {
  29. if notifier.changed().await.is_err() {
  30. // The runner will be stopped if the corresponding Sender drop.
  31. break;
  32. }
  33. if *notifier.borrow() {
  34. break;
  35. }
  36. let mut interval = interval(self.debounce_duration);
  37. interval.tick().await;
  38. let _ = self.scheduler.write().await.process_next_task().await;
  39. }
  40. }
  41. }