tractor/examples/asynchronous_generators.py

43 lines
995 B
Python

from typing import AsyncIterator
from itertools import repeat
import trio
import tractor
async def stream_forever() -> AsyncIterator[int]:
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():
async with tractor.open_nursery() as n:
portal = await n.start_actor(
'donny',
enable_modules=[__name__],
)
# this async for loop streams values from the above
# async generator running in a separate process
async with portal.open_stream_from(stream_forever) as stream:
count = 0
async for letter in stream:
print(letter)
count += 1
if count > 50:
break
print('stream terminated')
await portal.cancel_actor()
if __name__ == '__main__':
trio.run(main)