37 lines
1.0 KiB
Python
37 lines
1.0 KiB
Python
|
from itertools import repeat
|
||
|
import trio
|
||
|
import tractor
|
||
|
|
||
|
tractor.log.get_console_log("INFO")
|
||
|
|
||
|
|
||
|
async def stream_forever():
|
||
|
for i in repeat("I can see these little future bubble things"):
|
||
|
# each yielded value is sent over the ``Channel`` to the
|
||
|
# parent actor
|
||
|
yield i
|
||
|
await trio.sleep(0.01)
|
||
|
|
||
|
|
||
|
async def main():
|
||
|
# stream for at most 1 seconds
|
||
|
with trio.move_on_after(1) as cancel_scope:
|
||
|
async with tractor.open_nursery() as n:
|
||
|
portal = await n.start_actor(
|
||
|
f'donny',
|
||
|
rpc_module_paths=[__name__],
|
||
|
)
|
||
|
|
||
|
# this async for loop streams values from the above
|
||
|
# async generator running in a separate process
|
||
|
async for letter in await portal.run(__name__, 'stream_forever'):
|
||
|
print(letter)
|
||
|
|
||
|
# we support trio's cancellation system
|
||
|
assert cancel_scope.cancelled_caught
|
||
|
assert n.cancelled
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
tractor.run(main, start_method='forkserver')
|