многопроцессорные модули импорта на Mac - PullRequest
2 голосов
/ 04 июля 2011

модули существуют внутри новых процессов перед импортом, используя многопроцессорную обработку 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 есть веская причина для этого?
Как модуль попал в подпроцесс?

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Проблема в том, что многопроцессорная система использует os.fork в Unix. Таким образом, подпроцесс становится копией основного процесса. Не знаю, что происходит с Fedora, но это не должно работать и на Linux.
Кажется, нет простого способа обойти это.

0 голосов
/ 05 июля 2011

Похоже, что реализация Mac обрабатывает импорт по-разному. Тем не менее, вы можете взломать его, создав собственный репозиторий модулей, используя:

my_modules['context'] = __import__('uuid')
uuid = my_modules['context']
uuid.UUID(...)

где context - это каждый из ваших процессов. Я не знаю, почему вы хотите это сделать, но это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...