Add initial readers-writer shm list tests
							parent
							
								
									0e4b37d122
								
							
						
					
					
						commit
						c01c22769b
					
				| 
						 | 
				
			
			@ -0,0 +1,84 @@
 | 
			
		|||
"""
 | 
			
		||||
Shared mem primitives and APIs.
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
# import numpy
 | 
			
		||||
import pytest
 | 
			
		||||
import trio
 | 
			
		||||
import tractor
 | 
			
		||||
from tractor._shm import (
 | 
			
		||||
    open_shm_list,
 | 
			
		||||
    attach_shm_list,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@tractor.context
 | 
			
		||||
async def child_read_shm_list(
 | 
			
		||||
    ctx: tractor.Context,
 | 
			
		||||
    shm_key: str,
 | 
			
		||||
    use_str: bool,
 | 
			
		||||
) -> None:
 | 
			
		||||
 | 
			
		||||
    shml = attach_shm_list(key=shm_key)
 | 
			
		||||
    await ctx.started(shml.key)
 | 
			
		||||
 | 
			
		||||
    async with ctx.open_stream() as stream:
 | 
			
		||||
        async for i in stream:
 | 
			
		||||
            print(f'reading shm list index: {i}')
 | 
			
		||||
 | 
			
		||||
            if use_str:
 | 
			
		||||
                expect = str(float(i))
 | 
			
		||||
            else:
 | 
			
		||||
                expect = float(i)
 | 
			
		||||
 | 
			
		||||
            assert expect == shml[i]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize(
 | 
			
		||||
    'use_str', [False, True],
 | 
			
		||||
)
 | 
			
		||||
def test_parent_writer_child_reader(
 | 
			
		||||
    use_str: bool,
 | 
			
		||||
):
 | 
			
		||||
 | 
			
		||||
    async def main():
 | 
			
		||||
        async with tractor.open_nursery() as an:
 | 
			
		||||
 | 
			
		||||
            # allocate writeable list in parent
 | 
			
		||||
            key = 'shm_list'
 | 
			
		||||
            shml = open_shm_list(
 | 
			
		||||
                key=key,
 | 
			
		||||
                readonly=False,
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            portal = await an.start_actor(
 | 
			
		||||
                'shm_reader',
 | 
			
		||||
                enable_modules=[__name__],
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            async with (
 | 
			
		||||
                portal.open_context(
 | 
			
		||||
                    child_read_shm_list,  # taken from pytest parameterization
 | 
			
		||||
                    shm_key=key,
 | 
			
		||||
                    use_str=use_str,
 | 
			
		||||
                ) as (ctx, sent),
 | 
			
		||||
 | 
			
		||||
                ctx.open_stream() as stream,
 | 
			
		||||
            ):
 | 
			
		||||
 | 
			
		||||
                assert sent == key
 | 
			
		||||
 | 
			
		||||
                for i in range(2 ** 10):
 | 
			
		||||
 | 
			
		||||
                    val = float(i)
 | 
			
		||||
                    if use_str:
 | 
			
		||||
                        val = str(val)
 | 
			
		||||
 | 
			
		||||
                    print(f'writing {val}')
 | 
			
		||||
                    shml[i] = val
 | 
			
		||||
                    await stream.send(i)
 | 
			
		||||
 | 
			
		||||
            await portal.cancel_actor()
 | 
			
		||||
 | 
			
		||||
    trio.run(main)
 | 
			
		||||
		Loading…
	
		Reference in New Issue