@@ -307,37 +307,37 @@ class Timer(Receiver[timedelta]):
307307 print(f"The timer has triggered {drift=}")
308308 ```
309309
310- But you can also use [`Select `][frequenz.channels.util.Select ] to combine it
311- with other receivers, and even start it (semi) manually:
310+ But you can also use a [`Selector `][frequenz.channels.util.Selector ] to combine
311+ it with other receivers, and even start it (semi) manually:
312312
313313 ```python
314314 import logging
315- from frequenz.channels.util import Select
315+ from frequenz.channels.util import Selector, selected_from
316316 from frequenz.channels import Broadcast
317317
318318 timer = Timer.timeout(timedelta(seconds=1.0), auto_start=False)
319319 chan = Broadcast[int]("input-chan")
320- receiver1 = chan.new_receiver()
320+ battery_data = chan.new_receiver()
321321
322322 timer = Timer.timeout(timedelta(seconds=1.0), auto_start=False)
323323 # Do some other initialization, the timer will start automatically if
324324 # a message is awaited (or manually via `reset()`).
325- select = Select(bat_1=receiver1 , timer=timer)
326- while await select.ready() :
327- if msg := select.bat_1 :
328- if val := msg.inner :
329- battery_soc = val
330- else:
331- logging.warning("battery channel closed")
332- elif drift := select. timer:
333- # Print some regular battery data
334- print(f"Battery is charged at {battery_soc}%")
325+ async with Selector(battery_data , timer) as selector:
326+ async for selected in selector :
327+ if selected_from(selected, battery_data) :
328+ if selected.was_closed() :
329+ logging.warning("battery channel closed")
330+ continue
331+ battery_soc = selected.value
332+ elif selected_from(selected, timer) :
333+ # Print some regular battery data
334+ print(f"Battery is charged at {battery_soc}%")
335335 ```
336336
337337 Example: Timeout example
338338 ```python
339339 import logging
340- from frequenz.channels.util import Select
340+ from frequenz.channels.util import Selector, selected_from
341341 from frequenz.channels import Broadcast
342342
343343 def process_data(data: int):
@@ -349,23 +349,23 @@ def do_heavy_processing(data: int):
349349 timer = Timer.timeout(timedelta(seconds=1.0), auto_start=False)
350350 chan1 = Broadcast[int]("input-chan-1")
351351 chan2 = Broadcast[int]("input-chan-2")
352- receiver1 = chan1.new_receiver()
353- receiver2 = chan2.new_receiver()
354- select = Select(bat_1=receiver1, heavy_process=receiver2, timeout=timer)
355- while await select.ready():
356- if msg := select.bat_1:
357- if val := msg.inner:
358- process_data(val)
352+ battery_data = chan1.new_receiver()
353+ heavy_process = chan2.new_receiver()
354+ async with Selector(battery_data, heavy_process, timer) as selector:
355+ async for selected in selector:
356+ if selected_from(selected, battery_data):
357+ if selected.was_closed():
358+ logging.warning("battery channel closed")
359+ continue
360+ process_data(selected.value)
359361 timer.reset()
360- else:
361- logging.warning("battery channel closed")
362- if msg := select.heavy_process:
363- if val := msg.inner:
364- do_heavy_processing(val)
365- else:
366- logging.warning("processing channel closed")
367- elif drift := select.timeout:
368- logging.warning("No data received in time")
362+ elif selected_from(selected, heavy_process):
363+ if selected.was_closed():
364+ logging.warning("processing channel closed")
365+ continue
366+ do_heavy_processing(selected.value)
367+ elif selected_from(selected, timer):
368+ logging.warning("No data received in time")
369369 ```
370370
371371 In this case `do_heavy_processing` might take 2 seconds, and we don't
0 commit comments