You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Multiprocessing Semaphore and BoundedSemaphore - incomplete features ('get_value' missing) on MacOSX. #125828
I've been working on this PR: Adding multiprocessing queue shutdown feature for a while on my Mac machine. I've come up with a solution for this new feature and wanted to check that it also worked on Linux. However, I had forgotten that BoundedSemaphore is not fully functional on MacOSX. In fact, there's no check for exceeding the upper bound. See this example:
importmultiprocessingasmpbs=mp.BoundedSemaphore(2)
print(bs) # <BoundedSemaphore(value=unknown, maxvalue=2)> note invalid representation string bs.release() # Succeed with MacOSX, Raise an exception on Linux
I had to revise my solution because it was invalid on Linux. Such a shame, I wasted a lot of time. I checked on the documentation a few days ago . There is not a specific warning about this case.
As a reminder, the initial reason is the absence of the sem_getvalue C function in the MacOSX semaphore implementation. This prevents retrieval of the current semaphore value. It also prevents the Semaphore use as a shared counter. This issue is (very ?) old, and still hasn't been solved from Apple, could a workaround be implemented on MacOSX, so that Semaphore and BoundedSemaphore would have the same functionalities as Linux/Win.
A workaround (in Python) would be to use a shared value and to revise the acquire and release methods in order to emulate the semaphore internal counter. It is quite possible that this solution would greatly reduce performance.
I've already done a lot of tests (See the attached draft PR). And also, this solution should fix the representation strings that are currently wrong.
Before going any further, I was wondering if there's a reason why no patch attempt has been implemented ? And was there an old discussion about this already ?
It was a long journey during which I dived into Python code and macOS system calls, exploring the mechanics of semaphores.
After a long period of work, I am pleased to present today two alternatives to address the missing get_value method in multiprocessing.Semaphore on macOS.
A first workaround written in Python, creating a dedicated class with two shared multiprocessing.Value to emulate the internal counters.
An another workaround written in C, located in _multiprocessing.Semlock, as suggested by @picnixz and @freakboy3742.
This fix relies on using shared memory protected by a system lock, plus adding a mutex for each semaphore.
I really hope that a Python core developer will be able to look into these two options.
Activity
YvesDup commentedon Jun 2, 2026
It was a long journey during which I dived into Python code and macOS system calls, exploring the mechanics of semaphores.
After a long period of work, I am pleased to present today two alternatives to address the missing
get_valuemethod inmultiprocessing.Semaphoreon macOS.multiprocessing.Valueto emulate the internal counters._multiprocessing.Semlock, as suggested by @picnixz and @freakboy3742.This fix relies on using shared memory protected by a system lock, plus adding a mutex for each semaphore.
I really hope that a Python core developer will be able to look into these two options.
YvesDup commentedon Jun 4, 2026
I suggest to add the 'OS-mac' topic.