Skip to content

Commit 2a5b2eb

Browse files
Refactor scheduler
1 parent 6392bb0 commit 2a5b2eb

9 files changed

Lines changed: 59 additions & 28 deletions

examples/cameraServiceExample.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def main() -> None:
3131
advertizer.advertise(info)
3232

3333
# Schedule periodic advertisements every 10 seconds
34-
advertizer.schedule(interval=10)
34+
advertizer.schedule_periodic(interval=10)
3535

3636
shutdown_event.wait()
3737

hello/api.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class HelloConfig:
1919
receiver_poll_timeout: float = 0.1
2020
advertizer_responder: bool = True
2121
advertizer_max_delay: float = 0.1
22+
discoverer_max_workers: int = 1
2223

2324

2425
class Hello(object):
@@ -41,7 +42,7 @@ def scheduled_advertizer(cls, config: HelloConfig) -> ScheduledAdvertizer:
4142
def default_discoverer(cls, config: HelloConfig) -> DefaultDiscoverer:
4243
sender = RadioSender(config.context)
4344
receiver = DishReceiver(config.context, config.receiver_max_workers, config.receiver_poll_timeout)
44-
return DefaultDiscoverer(sender, receiver)
45+
return DefaultDiscoverer(sender, receiver, config.discoverer_max_workers)
4546

4647
@classmethod
4748
def scheduled_discoverer(cls, config: HelloConfig) -> ScheduledDiscoverer:

hello/scheduler.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414

1515
class Scheduler(Generic[T]):
1616

17-
def schedule(self, data: T | None = None, interval: float = 60, one_shot: bool = False) -> None:
17+
def schedule_periodic(self, data: T | None = None, interval: float | None = None) -> None:
18+
raise NotImplementedError()
19+
20+
def schedule_one_shot(self, data: T | None = None, interval: float | None = None) -> None:
1821
raise NotImplementedError()
1922

2023
def stop(self) -> None:
@@ -23,22 +26,25 @@ def stop(self) -> None:
2326

2427
class AbstractScheduler(Scheduler[T]):
2528

26-
def __init__(self, timer: IReusableTimer) -> None:
29+
def __init__(self, timer: IReusableTimer, interval: float = 60) -> None:
2730
self._timer = timer
31+
self._interval = interval
2832

2933
def __enter__(self) -> Scheduler[T]:
3034
return self
3135

3236
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
3337
self.stop()
3438

35-
def schedule(self, data: T | None = None, interval: float = 60, one_shot: bool = False) -> None:
36-
if one_shot:
37-
self._timer.start(interval, self._execute, [data])
38-
log.info('One-shot execution scheduled', data=data, interval=interval)
39-
else:
40-
self._timer.start(interval, self._execute_and_restart, [data])
41-
log.info('Periodic execution scheduled', data=data, interval=interval)
39+
def schedule_periodic(self, data: T | None = None, interval: float | None = None) -> None:
40+
interval = interval or self._interval
41+
self._timer.start(interval, self._execute_and_restart, [data])
42+
log.info('Periodic execution scheduled', data=data, interval=interval)
43+
44+
def schedule_one_shot(self, data: T | None = None, interval: float | None = None) -> None:
45+
interval = interval or self._interval
46+
self._timer.start(interval, self._execute, [data])
47+
log.info('One-shot execution scheduled', data=data, interval=interval)
4248

4349
def stop(self) -> None:
4450
self._timer.cancel()

tests/abstractSchedulerTest.py

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,23 +47,47 @@ def test_schedules_execution_once(self):
4747
data = MagicMock()
4848

4949
# When
50-
scheduler.schedule(data, 60, True)
50+
scheduler.schedule_one_shot(data, 60)
5151

5252
# Then
5353
timer.start.assert_called_once_with(60, scheduler._execute, [data])
5454

55-
def test_schedules_periodic_discover(self):
55+
def test_schedules_execution_once_with_default_interval(self):
56+
# Given
57+
timer = MagicMock(spec=IReusableTimer)
58+
scheduler = TestScheduler(timer, 10)
59+
data = MagicMock()
60+
61+
# When
62+
scheduler.schedule_one_shot(data)
63+
64+
# Then
65+
timer.start.assert_called_once_with(10, scheduler._execute, [data])
66+
67+
def test_schedules_execution_periodically(self):
5668
# Given
5769
timer = MagicMock(spec=IReusableTimer)
5870
scheduler = TestScheduler(timer)
5971
data = MagicMock()
6072

6173
# When
62-
scheduler.schedule(data, 60, False)
74+
scheduler.schedule_periodic(data, 60)
6375

6476
# Then
6577
timer.start.assert_called_once_with(60, scheduler._execute_and_restart, [data])
6678

79+
def test_schedules_execution_periodically_with_default_interval(self):
80+
# Given
81+
timer = MagicMock(spec=IReusableTimer)
82+
scheduler = TestScheduler(timer, 10)
83+
data = MagicMock()
84+
85+
# When
86+
scheduler.schedule_periodic(data)
87+
88+
# Then
89+
timer.start.assert_called_once_with(10, scheduler._execute_and_restart, [data])
90+
6791
def test_execute_and_restart_restarts_timer(self):
6892
# Given
6993
timer = MagicMock(spec=IReusableTimer)
@@ -79,8 +103,8 @@ def test_execute_and_restart_restarts_timer(self):
79103

80104
class TestScheduler(AbstractScheduler[Any]):
81105

82-
def __init__(self, timer: IReusableTimer) -> None:
83-
super().__init__(timer)
106+
def __init__(self, timer: IReusableTimer, interval: float = 0) -> None:
107+
super().__init__(timer, interval)
84108

85109
def _execute(self, data: Any | None = None) -> None:
86110
pass

tests/advertizerIntegrationTest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def test_sends_hello_when_schedules_advertisement_once(self):
117117
scheduled_advertizer.start(GROUP)
118118

119119
# When
120-
scheduled_advertizer.schedule(SERVICE_INFO, interval=0.01, one_shot=True)
120+
scheduled_advertizer.schedule_one_shot(SERVICE_INFO, interval=0.01)
121121

122122
wait_for_assertion(1, lambda: self.assertEqual(1, len(messages)))
123123

@@ -138,7 +138,7 @@ def test_sends_hello_when_schedules_advertisement_periodically(self):
138138
scheduled_advertizer.start(GROUP)
139139

140140
# When
141-
scheduled_advertizer.schedule(SERVICE_INFO, interval=0.01)
141+
scheduled_advertizer.schedule_periodic(SERVICE_INFO, interval=0.01)
142142

143143
# Then
144144
wait_for_assertion(1, lambda: self.assertTrue(len(messages) >= 10))

tests/apiIntegrationTest.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def test_discoverer_caches_advertised_service_when_advertisement_scheduled_once(
7575
discoverer.start(GROUP, SERVICE_QUERY)
7676

7777
# When
78-
advertizer.schedule(interval=0.01, one_shot=True)
78+
advertizer.schedule_one_shot(interval=0.01)
7979

8080
wait_for_assertion(1, lambda: self.assertEqual(1, len(discoverer.get_services())))
8181

@@ -92,7 +92,7 @@ def test_discoverer_caches_advertised_service_when_advertisement_scheduled_perio
9292
discoverer.start(GROUP, SERVICE_QUERY)
9393

9494
# When
95-
advertizer.schedule(interval=0.01)
95+
advertizer.schedule_periodic(interval=0.01)
9696

9797
wait_for_assertion(1, lambda: self.assertEqual(1, len(discoverer.get_services())))
9898

@@ -150,7 +150,7 @@ def test_discoverer_caches_discovery_response_service_when_discovery_scheduled_o
150150
discoverer.start(GROUP, SERVICE_QUERY)
151151

152152
# When
153-
discoverer.schedule(interval=0.01, one_shot=True)
153+
discoverer.schedule_one_shot(interval=0.01)
154154

155155
wait_for_assertion(1, lambda: self.assertEqual(1, len(discoverer.get_services())))
156156

@@ -167,7 +167,7 @@ def test_discoverer_caches_discovery_response_service_when_discovery_scheduled_p
167167
discoverer.start(GROUP, SERVICE_QUERY)
168168

169169
# When
170-
discoverer.schedule(interval=0.01)
170+
discoverer.schedule_periodic(interval=0.01)
171171

172172
wait_for_assertion(1, lambda: self.assertEqual(1, len(discoverer.get_services())))
173173

tests/discovererIntegrationTest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def test_sends_query_when_schedules_discovery_once(self):
107107
scheduled_discoverer.start(GROUP)
108108

109109
# When
110-
scheduled_discoverer.schedule(SERVICE_QUERY, interval=0.01, one_shot=True)
110+
scheduled_discoverer.schedule_one_shot(SERVICE_QUERY, interval=0.01)
111111

112112
wait_for_assertion(1, lambda: self.assertEqual(1, len(messages)))
113113

@@ -129,7 +129,7 @@ def test_sends_query_when_schedules_discovery_periodically(self):
129129
scheduled_discoverer.start(GROUP)
130130

131131
# When
132-
scheduled_discoverer.schedule(SERVICE_QUERY, interval=0.01)
132+
scheduled_discoverer.schedule_periodic(SERVICE_QUERY, interval=0.01)
133133

134134
# Then
135135
wait_for_assertion(1, lambda: self.assertTrue(len(messages) >= 10))

tests/scheduledAdvertizerTest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def test_schedules_advertise_once(self):
8181
scheduled_advertizer.start(GROUP)
8282

8383
# When
84-
scheduled_advertizer.schedule(SERVICE_INFO, 60, True)
84+
scheduled_advertizer.schedule_one_shot(SERVICE_INFO, 60)
8585

8686
# Then
8787
timer.start.assert_called_once_with(60, scheduled_advertizer._execute, [SERVICE_INFO])
@@ -94,7 +94,7 @@ def test_schedules_periodic_advertise(self):
9494
scheduled_advertizer.start(GROUP)
9595

9696
# When
97-
scheduled_advertizer.schedule(SERVICE_INFO, 60, False)
97+
scheduled_advertizer.schedule_periodic(SERVICE_INFO, 60)
9898

9999
# Then
100100
timer.start.assert_called_once_with(60, scheduled_advertizer._execute_and_restart, [SERVICE_INFO])

tests/scheduledDiscovererTest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def test_schedules_discover_once(self):
107107
scheduled_discoverer.start(GROUP)
108108

109109
# When
110-
scheduled_discoverer.schedule(SERVICE_QUERY, 60, True)
110+
scheduled_discoverer.schedule_one_shot(SERVICE_QUERY, 60)
111111

112112
# Then
113113
timer.start.assert_called_once_with(60, scheduled_discoverer._execute, [SERVICE_QUERY])
@@ -120,7 +120,7 @@ def test_schedules_periodic_discover(self):
120120
scheduled_discoverer.start(GROUP)
121121

122122
# When
123-
scheduled_discoverer.schedule(SERVICE_QUERY, 60, False)
123+
scheduled_discoverer.schedule_periodic(SERVICE_QUERY, 60)
124124

125125
# Then
126126
timer.start.assert_called_once_with(60, scheduled_discoverer._execute_and_restart, [SERVICE_QUERY])

0 commit comments

Comments
 (0)