Вы можете, используя другой метод запуска, чем 'fork' для создания процесса. Ваша ОС использует fork (вы не получите PicklingError
за использование лямбды в качестве цели).
Вы можете изменить метод запуска на «spawn» (по умолчанию и только в Windows) с помощью multiprocessing.set_start_method('spaw')
или на «forkserver», если он доступен. Получить все доступные методы с multiprocessing.get_all_start_methods()
.
#check_environ.py
import sys, os, subprocess
import multiprocessing as mp
def show(s):
print('multiprocessing', os.getenv('PYTHONHASHSEED'), hash(s))
if __name__ == '__main__':
mp.set_start_method('spawn')
s = 'hello'
print('parent', os.getenv('PYTHONHASHSEED'), hash(s))
if len(sys.argv) > 1:
os.environ['PYTHONHASHSEED'] = sys.argv[1]
cmd = "import os; " \
"print('subprocess', os.getenv('PYTHONHASHSEED'), hash('{}'))"
subprocess.call(['python', '-c', cmd.format(s)])
p = mp.Process(target=show, args=(s,))
p.start()
p.join()
Выход на клемме:
$ python check_environ.py 12
parent None 4279361553958749032
subprocess 12 -8207222429063474615
multiprocessing 12 -8207222429063474615
Если вам нужно переключаться между методами запуска несколько раз, используйте объект контекста для установки метода запуска:
ctx = mp.get_context('spawn')
p = ctx.Process(target=foo, args=(var,))
Но будьте готовы заплатить огромный штраф времени за использование другого метода запуска, кроме форка. Я показал, как только запускаю процесс python на моей машине с Ubuntu 18.04 с:
- вилка 1,59 мс
- forkserver 289,83 мс
- спавн 348,20 мс
Но это не обязательно относится к вашему случаю использования.