def test_SemLock_raises_on_non_string_name(): from _multiprocessing import SemLock try : SemLock(kind=1, value=1, name={1:2}, maxvalue=1, unlink=1) except TypeError: raised = True assert raised
def test_semaphore(self): from _multiprocessing import SemLock import sys assert SemLock.SEM_VALUE_MAX > 10 kind = self.SEMAPHORE value = 1 maxvalue = 1 sem = SemLock(kind, value, maxvalue) assert sem.kind == kind assert sem.maxvalue == maxvalue assert isinstance(sem.handle, (int, long)) assert sem._count() == 0 if sys.platform == 'darwin': raises(NotImplementedError, 'sem._get_value()') else: assert sem._get_value() == 1 assert sem._is_zero() == False sem.acquire() assert sem._is_mine() assert sem._count() == 1 if sys.platform == 'darwin': raises(NotImplementedError, 'sem._get_value()') else: assert sem._get_value() == 0 assert sem._is_zero() == True sem.release() assert sem._count() == 0 sem.acquire() sem._after_fork() assert sem._count() == 0
def test_notify_all(): """A low-level variation on test_notify_all() in lib-python's test_multiprocessing.py """ N_THREADS = 1000 lock = SemLock(0, 1, 1) results = [] def f(n): if lock.acquire(timeout=5.): results.append(n) lock.release() else: print("lock acquire timed out!") threads = [Thread(target=f, args=(i, )) for i in range(N_THREADS)] n_started = N_THREADS with lock: for t in threads: try: t.start() except thread.error: # too many threads for this system t.started = False n_started -= 1 else: t.started = True time.sleep(0.1) print("started %d threads" % n_started) for t in threads: if t.started: t.join() assert len(results) == n_started
def test_semaphore_basic(self): from _multiprocessing import SemLock import sys assert SemLock.SEM_VALUE_MAX > 10 kind = self.SEMAPHORE value = 1 maxvalue = 1 # the following line gets OSError: [Errno 38] Function not implemented # if /dev/shm is not mounted on Linux sem = SemLock(kind, value, maxvalue) assert sem.kind == kind assert sem.maxvalue == maxvalue assert isinstance(sem.handle, (int, long)) assert sem._count() == 0 if sys.platform == 'darwin': raises(NotImplementedError, 'sem._get_value()') else: assert sem._get_value() == 1 assert sem._is_zero() == False sem.acquire() assert sem._is_mine() assert sem._count() == 1 if sys.platform == 'darwin': raises(NotImplementedError, 'sem._get_value()') else: assert sem._get_value() == 0 assert sem._is_zero() == True sem.release() assert sem._count() == 0 sem.acquire() sem._after_fork() assert sem._count() == 0
def test_semaphore_rebuild(self): from _multiprocessing import SemLock kind = self.SEMAPHORE value = 1 maxvalue = 1 sem = SemLock(kind, value, maxvalue) sem2 = SemLock._rebuild(sem.handle, kind, value) assert sem.handle == sem2.handle
def test_semaphore_contextmanager(self): from _multiprocessing import SemLock kind = self.SEMAPHORE value = 1 maxvalue = 1 sem = SemLock(kind, value, maxvalue) with sem: assert sem._count() == 1 assert sem._count() == 0
def test_semaphore_wait(self): from _multiprocessing import SemLock kind = self.SEMAPHORE value = 1 maxvalue = 1 sem = SemLock(kind, value, maxvalue) res = sem.acquire() assert res == True res = sem.acquire(timeout=0.1) assert res == False
def test_semaphore_maxvalue(self): from _multiprocessing import SemLock import sys kind = self.SEMAPHORE value = SemLock.SEM_VALUE_MAX maxvalue = SemLock.SEM_VALUE_MAX sem = SemLock(kind, value, maxvalue) for i in range(10): res = sem.acquire() assert res == True assert sem._count() == i + 1 if sys.platform != 'darwin': assert sem._get_value() == maxvalue - (i + 1) value = 0 maxvalue = SemLock.SEM_VALUE_MAX sem = SemLock(kind, value, maxvalue) for i in range(10): sem.release() assert sem._count() == -(i + 1) if sys.platform != 'darwin': assert sem._get_value() == i + 1
def test_recursive(self): from _multiprocessing import SemLock kind = self.RECURSIVE value = 1 maxvalue = 1 sem = SemLock(kind, value, maxvalue) sem.acquire() sem.release() assert sem._count() == 0 sem.acquire() sem.release() # now recursively sem.acquire() sem.acquire() assert sem._count() == 2 sem.release() sem.release()
def test_recursive(self): from _multiprocessing import SemLock kind = self.RECURSIVE value = 1 maxvalue = 1 # the following line gets OSError: [Errno 38] Function not implemented # if /dev/shm is not mounted on Linux sem = SemLock(kind, value, maxvalue, "2", unlink=True) sem.acquire() sem.release() assert sem._count() == 0 sem.acquire() sem.release() # now recursively sem.acquire() sem.acquire() assert sem._count() == 2 sem.release() sem.release()
def test_semaphore_rebuild(self): import sys if sys.platform == 'win32': from _multiprocessing import SemLock def sem_unlink(*args): pass else: from _multiprocessing import SemLock, sem_unlink kind = self.SEMAPHORE value = 1 maxvalue = 1 sem = SemLock(kind, value, maxvalue, "4.2", unlink=False) try: sem2 = SemLock._rebuild(-1, kind, value, "4.2") #assert sem.handle != sem2.handle---even though they come # from different calls to sem_open(), on Linux at least, # they are the same pointer sem2 = SemLock._rebuild(sem.handle, kind, value, None) assert sem.handle == sem2.handle finally: sem_unlink("4.2")
def test_in_threads(self): from _multiprocessing import SemLock from threading import Thread from time import sleep l = SemLock(0, 1, 1) if self.runappdirect: def f(id): for i in range(10000): pass else: def f(id): for i in range(1000): # reduce the probability of thread switching # at exactly the wrong time in semlock_acquire for j in range(10): pass threads = [Thread(None, f, args=(i,)) for i in range(2)] [t.start() for t in threads] # if the RLock calls to sem_wait and sem_post do not match, # one of the threads will block and the call to join will fail [t.join() for t in threads]
# 2nd stage: validate that locking is available on the system and # issue a warning if not if mp is not None: try: # try to create a named semaphore using SemLock to make sure they are # available on this platform. We use the low level object # _multiprocessing.SemLock to avoid spawning a resource tracker on # Unix system or changing the default backend. import tempfile from _multiprocessing import SemLock _rand = tempfile._RandomNameSequence() for i in range(100): try: name = '/joblib-{}-{}'.format(os.getpid(), next(_rand)) _sem = SemLock(0, 0, 1, name=name, unlink=True) del _sem # cleanup break except FileExistsError: # pragma: no cover if i >= 99: raise FileExistsError('cannot find name for semaphore') except (FileExistsError, AttributeError, ImportError, OSError) as e: mp = None warnings.warn('%s. joblib will operate in serial mode' % (e, )) # 3rd stage: backward compat for the assert_spawning helper if mp is not None: from multiprocessing.context import assert_spawning else: assert_spawning = None
def test_unlink(self): from _multiprocessing import SemLock sem = SemLock(self.SEMAPHORE, 1, 1, '/mp-123', unlink=True) assert sem._count() == 0