#!/usr/bin/env python3.9 from multiprocessing import shared_memory, resource_tracker import os, random, signal, sys ####################################################### def remove_shm_from_resource_tracker(): """Monkey-patch multiprocessing.resource_tracker so SharedMemory won't be tracked More details at: https://bugs.python.org/issue38119 """ def fix_register(name, rtype): if rtype == "shared_memory": return return resource_tracker._resource_tracker.register(self, name, rtype) resource_tracker.register = fix_register def fix_unregister(name, rtype): if rtype == "shared_memory": return return resource_tracker._resource_tracker.unregister(self, name, rtype) resource_tracker.unregister = fix_unregister if "shared_memory" in resource_tracker._CLEANUP_FUNCS: del resource_tracker._CLEANUP_FUNCS["shared_memory"] ####################################################### remove_shm_from_resource_tracker() ## turicas's monkeypatch protects ## shared memory from garbage collection ## by resource_tracker sharedMemoryName = 'EricIdle' sharedMemoryObjects = [] try: if sys.argv[ 1] == 'unlink': try: sharedMemoryObjects.append( shared_memory.SharedMemory( name = sharedMemoryName, ) ) except FileNotFoundError: print( f'Shared memory {sharedMemoryName} does not exist.') sys.exit( 1) sharedMemoryObjects[ -1].close() sharedMemoryObjects[ -1].unlink() print( f'unlinked {sharedMemoryName}') sys.exit( 0) except IndexError: pass try: sharedMemoryObjects.append( shared_memory.SharedMemory( name = sharedMemoryName, create = True, size = 2**21, ), ) print( f'Created shared memory {sharedMemoryName}.') except FileExistsError: print( f'Not creating shared memory {sharedMemoryName}; already exists.') sharedMemoryObjects.append( shared_memory.SharedMemory( name = sharedMemoryName, ) ) import time while True: print( f'\n{sharedMemoryObjects[ -1]}') print( f'before: {bytes( sharedMemoryObjects[ -1].buf[ 0: 15])}') ba = bytes( 'asdfjkl;%s' % ( os.getpid()), 'utf-8') sharedMemoryObjects[ -1].buf[ 0:len( ba)] = ba ba = bytes( str( random.random())[ 2:6], 'utf-8') sharedMemoryObjects[ -1].buf[ 0:len( ba)] = ba print( f' after: {bytes( sharedMemoryObjects[ -1].buf[ 0: 15])}') time.sleep( 5)