◐ Shell
clean mode source ↗

multiprocessing child segfault when passing lock as an argument

Crash report

What happened?

It seems that the below code will serialize the pointer to the lock handle over to the child process, and then rebuild the raw pointer in https://github.com/python/cpython/blob/main/Modules/_multiprocessing/clinic/semaphore.c.h#L331

this then segfaults the child process - which seems to cause new children to spin up.

import multiprocessing
import os

def _init(l):
    print(os.getpid())
    print(l)

def main():
    ctx = multiprocessing.get_context(method="spawn")
    lock = multiprocessing.Lock()
    with ctx.Pool(1, initializer=_init, initargs=(lock,)) as pool:
        ret = pool.map(print, [1])

if __name__ == "__main__":
    main()

CPython versions tested on:

3.10, 3.11

Operating systems tested on:

Linux

Output from running 'python -VV' on the command line:

No response