NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #554 most downloaded on PyPI
Python multiprocessing fork with improvements and bugfixes
Last release 12 days ago
17 Sep 2026
Ships fairly regularly
a new release about every 7 months
Most releases are documented
notes for 50 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
17 years old
88 releases · first in 2009
Pool: Disable restart limit if maxR is not set.
Pool: Disable restart limit if maxR is not set.
Pool: Now uses os.kill instead of signal.signal.
Contributed by Lukasz Langa
Fixed name error in process.py
Pool: ApplyResult.get now properly raises exceptions.
Fix contributed by xentac.
Fixes problem at shutdown when gc has collected symbols.
Fixes problem at shutdown when gc has collected symbols.
Pool now always uses _kill for Py2.5 compatibility on Windows (Issue #32).
Fixes Python 3 compatibility issues
One column per quarter.
[Pool] Fix for check_timeouts if not set.
[Pool] Fix for check_timeouts if not set.
Fix contributed by Dmitry Sukhov
Fixed pickle problem with Traceback.
Code.frame.loader is now ignored as it may be set to an unpickleable object.
The Django old-layout warning was always showing.
- Fixes typo
Windows: Fixes for SemLock._rebuild (Issue #24).
Windows: Fixes for SemLock._rebuild (Issue #24).
Pool: Job terminated with terminate_job now raises billiard.exceptions.Terminated.
Windows: Fixes unpickling of SemLock when using fallback.
Windows: Fixes unpickling of SemLock when using fallback.
Windows: Fixes installation when no C compiler.
Installation now works again for Python 3.
Merged with Python trunk (many authors, many fixes: see Python changelog in trunk).
Merged with Python trunk (many authors, many fixes: see Python changelog in trunk).
Using execv now also works with older Django projects using setup_environ (Issue #10).
Billiard now installs with a warning that the C extension could not be built if a compiler is not installed or the build fails in some other way.
It really is recommended to have the C extension installed when running with force execv, but this change also makes it easier to install.
Pool: Hard timeouts now sends KILL shortly after TERM so that C extensions cannot block the signal.
Python signal handlers are called in the interpreter, so they cannot be called while a C extension is blocking the interpreter from running.
Now uses a timeout value for Thread.join that doesn't exceed the maximum on some platforms.
Fixed bug in the SemLock fallback used when C extensions not installed.
Fix contributed by Mher Movsisyan.
Pool: Now sets a Process.index attribute for every process in the pool.
This number will always be between 0 and concurrency-1, and can be used to e.g. create a logfile for each process in the pool without creating a new logfile whenever a process is replaced.
Fixed Python 2.5 compatibility issue.
Fixed Python 2.5 compatibility issue.
New Pool.terminate_job(pid) to terminate a job without raising WorkerLostError
Pool: New argument allow_restart is now required to enable the pool process sentinel that is required to restart the pool.
Adds support for FreeBSD 7+
Fix contributed by koobs.
Pool: New argument allow_restart is now required to enable
the pool process sentinel that is required to restart the pool.
It's disabled by default, which reduces the number of file descriptors/semaphores required to run the pool.
Pool: Now emits a warning if a worker process exited with error-code.
But not if the error code is 155, which is now returned if the worker process was recycled (maxtasksperchild).
Python 3 compatibility fixes.
Python 2.5 compatibility fixes.
The TimeLimitExceeded exception string representation only included the seconds as a number, it now gives a more human friendly description.
The TimeLimitExceeded exception string representation
only included the seconds as a number, it now gives a more human
friendly description.
Fixed typo in LaxBoundedSemaphore.shrink.
Pool: ResultHandler.handle_event no longer requires
any arguments.
setup.py bdist now works
Environment variable MP_MAIN_FILE envvar is now set to the path of the __main__ module when execv is enabled.
Environment variable MP_MAIN_FILE envvar is now set to
the path of the __main__ module when execv is enabled.
Pool: Errors occurring in the TaskHandler are now reported.
Issue #12091: simplify ApplyResult and MapResult with threading.Event
Can now be installed on Py 3.2
Issue #12091: simplify ApplyResult and MapResult with threading.Event
Patch by Charles-Francois Natali
Pool: Support running without TimeoutHandler thread.
The with_*_thread arguments has also been replaced with
a single threads=True argument.
Two new pool callbacks:
on_timeout_set(job, soft, hard)
Applied when a task is executed with a timeout.
on_timeout_cancel(job)
Applied when a timeout is cancelled (the job completed)
- Fixes Python 2.5 support.
Pool: Can now be used in an event loop, without starting the supporting threads (TimeoutHandler still not supported)
Pool: Can now be used in an event loop, without starting the supporting threads (TimeoutHandler still not supported)
To facilitate this the pool has gained the following keyword arguments:
- ``with_task_thread``
- ``with_result_thread``
- ``with_supervisor_thread``
- ``on_process_up``
Callback called with Process instance as argument
whenever a new worker process is added.
Used to add new process fds to the eventloop::
def on_process_up(proc):
hub.add_reader(proc.sentinel, pool.maintain_pool)
- ``on_process_down``
Callback called with Process instance as argument
whenever a new worker process is found dead.
Used to remove process fds from the eventloop::
def on_process_down(proc):
hub.remove(proc.sentinel)
- ``semaphore``
Sets the semaphore used to protect from adding new items to the
pool when no processes available. The default is a threaded
one, so this can be used to change to an async semaphore.
And the following attributes::
- ``readers``
A map of ``fd`` -> ``callback``, to be registered in an eventloop.
Currently this is only the result outqueue with a callback
that processes all currently incoming results.
And the following methods::
- ``did_start_ok``
To be called after starting the pool, and after setting up the
eventloop with the pool fds, to ensure that the worker processes
didn't immediately exit caused by an error (internal/memory).
- ``maintain_pool``
Public version of ``_maintain_pool`` that handles max restarts.
Pool: Process too frequent restart protection now only counts if the process had a non-successful exit-code.
This to take into account the maxtasksperchild option, and allowing processes to exit cleanly on their own.
Pool: New options max_restart + max_restart_freq
This means that the supervisor can't restart processes faster than max_restart' times per max_restart_freq seconds (like the Erlang supervisor maxR & maxT settings).
The pool is closed and joined if the max restart frequency is exceeded, where previously it would keep restarting at an unlimited rate, possibly crashing the system.
The current default value is to stop if it exceeds 100 * process_count restarts in 1 seconds. This may change later.
It will only count processes with an unsuccessful exit code,
this is to take into account the maxtasksperchild setting
and code that voluntarily exits.
Pool: The WorkerLostError message now includes the exit-code of the
process that disappeared.
Now always cleans up after sys.exc_info() to avoid cyclic references.
Now always cleans up after sys.exc_info() to avoid
cyclic references.
ExceptionInfo without arguments now defaults to sys.exc_info.
Forking can now be disabled using the
MULTIPROCESSING_FORKING_DISABLE environment variable.
Also this envvar is set so that the behavior is inherited after execv.
The semaphore cleanup process started when execv is used
now sets a useful process name if the setproctitle
module is installed.
Sets the FORKED_BY_MULTIPROCESSING
environment variable if forking is disabled.
Added billiard.ensure_multiprocessing()
Added billiard.ensure_multiprocessing()
Raises NotImplementedError if the platform does not support multiprocessing (e.g. Jython).
PyPy now falls back to using its internal _multiprocessing module, so everything works except for forking_enable(False) (which silently degrades).
PyPy now falls back to using its internal _multiprocessing module, so everything works except for forking_enable(False) (which silently degrades).
Fixed Python 2.5 compat. issues.
Uses more with statements
Merged some of the changes from the Python 3 branch.
Now installs on PyPy/Jython (but does not work).
- Python 2.5 support added.
Python 2.4 support removed, now only supports 2.5, 2.6 and 2.7. (may consider py3k support at some point).
Updated from Python 2.7.3
Python 2.4 support removed, now only supports 2.5, 2.6 and 2.7. (may consider py3k support at some point).
Pool improvements from Celery.
no-execv patch added (https://bugs.python.org/issue8713)
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →