2021-08-03 01:49:15 +00:00
|
|
|
from typing import AsyncIterator
|
2020-02-09 07:01:39 +00:00
|
|
|
from itertools import repeat
|
2021-08-03 01:49:15 +00:00
|
|
|
|
2020-02-09 07:01:39 +00:00
|
|
|
import trio
|
|
|
|
import tractor
|
|
|
|
|
|
|
|
|
2021-08-03 01:49:15 +00:00
|
|
|
async def stream_forever() -> AsyncIterator[int]:
|
2020-02-09 07:01:39 +00:00
|
|
|
|
|
|
|
for i in repeat("I can see these little future bubble things"):
|
2021-08-03 01:49:15 +00:00
|
|
|
# each yielded value is sent over the ``Channel`` to the parent actor
|
2020-02-09 07:01:39 +00:00
|
|
|
yield i
|
|
|
|
await trio.sleep(0.01)
|
|
|
|
|
|
|
|
|
|
|
|
async def main():
|
2021-02-24 18:39:14 +00:00
|
|
|
|
2021-08-03 01:49:15 +00:00
|
|
|
async with tractor.open_nursery() as n:
|
|
|
|
|
|
|
|
portal = await n.start_actor(
|
|
|
|
'donny',
|
|
|
|
enable_modules=[__name__],
|
|
|
|
)
|
2021-02-24 18:39:14 +00:00
|
|
|
|
2021-08-03 01:49:15 +00:00
|
|
|
# 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
|
2021-02-24 18:39:14 +00:00
|
|
|
|
2021-08-03 01:49:15 +00:00
|
|
|
if count > 50:
|
|
|
|
break
|
2020-02-09 07:01:39 +00:00
|
|
|
|
2021-08-03 01:49:15 +00:00
|
|
|
print('stream terminated')
|
2020-02-09 07:01:39 +00:00
|
|
|
|
2021-08-03 01:49:15 +00:00
|
|
|
await portal.cancel_actor()
|
2020-02-09 07:01:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2021-02-24 18:39:14 +00:00
|
|
|
trio.run(main)
|