Add `try_read()` to shm mod
							parent
							
								
									0ae79d6418
								
							
						
					
					
						commit
						5ba9345c63
					
				| 
						 | 
					@ -505,3 +505,35 @@ def maybe_open_shm_array(
 | 
				
			||||||
        # to fail if a block has been allocated
 | 
					        # to fail if a block has been allocated
 | 
				
			||||||
        # on the OS by someone else.
 | 
					        # on the OS by someone else.
 | 
				
			||||||
        return open_shm_array(key=key, dtype=dtype, **kwargs), True
 | 
					        return open_shm_array(key=key, dtype=dtype, **kwargs), True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def try_read(
 | 
				
			||||||
 | 
					    array: np.ndarray
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					) -> Optional[np.ndarray]:
 | 
				
			||||||
 | 
					    '''
 | 
				
			||||||
 | 
					    Try to read the last row from a shared mem array or ``None``
 | 
				
			||||||
 | 
					    if the array read returns a zero-length array result.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Can be used to check for backfilling race conditions where an array
 | 
				
			||||||
 | 
					    is currently being (re-)written by a writer actor but the reader is
 | 
				
			||||||
 | 
					    unaware and reads during the window where the first and last indexes
 | 
				
			||||||
 | 
					    are being updated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    '''
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        return array[-1]
 | 
				
			||||||
 | 
					    except IndexError:
 | 
				
			||||||
 | 
					        # XXX: race condition with backfilling shm.
 | 
				
			||||||
 | 
					        #
 | 
				
			||||||
 | 
					        # the underlying issue is that a backfill (aka prepend) and subsequent
 | 
				
			||||||
 | 
					        # shm array first/last index update could result in an empty array
 | 
				
			||||||
 | 
					        # read here since the indices may be updated in such a way that
 | 
				
			||||||
 | 
					        # a read delivers an empty array (though it seems like we
 | 
				
			||||||
 | 
					        # *should* be able to prevent that?). also, as and alt and
 | 
				
			||||||
 | 
					        # something we need anyway, maybe there should be some kind of
 | 
				
			||||||
 | 
					        # signal that a prepend is taking place and this consumer can
 | 
				
			||||||
 | 
					        # respond (eg. redrawing graphics) accordingly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # the array read was emtpy
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue