модули существуют внутри новых процессов перед импортом, используя многопроцессорную обработку Python на OSX.
Вот пример:
import multiprocessing
import sys
import os
print 'importing module'
def main():
import uuid
print 'setting var'
uuid.some_variable = True
def process(name):
print 'uuid module loaded:', 'uuid' in sys.modules
print 'process pid', os.getpid()
import uuid
var = uuid.some_variable
print 'var exists on mac', var
if __name__ == '__main__':
print 'main pid', os.getpid()
main()
p = multiprocessing.Process(target=process, args=('test',))
p.start()
p.join()
вывод на windows / linux - это то, что я ожидал. Сценарий импортируется дважды, uuid.some_variable не существует, и uuid не загружается до импорта:
importing module
main pid 4352
setting var
importing module
uuid module loaded: False
process pid 4988
AttributeError: 'module' object has no attribute 'some_variable'
Однако на osx скрипт будет импортирован только один раз, uuid загружается перед импортом, и uuid.some_variable существует в новом процессе:
importing module
main pid 4399
setting var
uuid module loaded: True
process pid 4400
var exists on mac True
Каким-то образом модуль uuid из основного процесса попадает в подпроцесс, не импортируя его.
Я что-то упустил, это ошибка, или у Mac есть веская причина для этого?
Как модуль попал в подпроцесс?