2016-01-05 3 views
3

PEP 8 состояние:Использование многопроцессорности в Python, каков правильный подход для операторов импорта?

Импорт всегда помещается в верхней части файла, только после любого модуля комментариев и строки документации, и перед модулем глобал и констант.

Однако, если класс/метод/функция, которые я импортирую, используется только дочерним процессом, то, действительно, эффективнее делать импорт, когда это необходимо? Мой код в основном:

p = multiprocessing.Process(target=main,args=(dump_file,)) 
p.start() 
p.join() 
print u"Process ended with exitcode: {}".format(p.exitcode) 
if os.path.getsize(dump_file) > 0: 
    blc = BugLogClient(listener='http://21.18.25.06:8888/bugLog/listeners/bugLogListenerREST.cfm',appName='main') 
    blc.notifyCrash(dump_file) 

main() является основным приложением. Этим функциям требуется много импорта для запуска, и они занимают некоторое пространство в пространстве (+/- 35 МБ). Поскольку приложение запускается в другом процессе, импорт выполняется дважды после PEP 8 (один раз родительским процессом, а другой - дочерним процессом). Следует также отметить, что эту функцию нужно вызывать только один раз, когда родительский процесс ожидает, чтобы приложение сработало и оставило код выхода (благодаря faulthandler). Так что я закодирован импорт внутри основной функции, как это:

def main(dump_file): 

    import shutil 
    import locale 

    import faulthandler 

    from PySide.QtCore import Qt 
    from PySide.QtGui import QApplication, QIcon 

вместо:

import shutil 
import locale 

import faulthandler 

from PySide.QtCore import Qt 
from PySide.QtGui import QApplication, QIcon 

def main(dump_file): 

Есть ли «стандартный» способ справиться с импортом сделана с использованием многопроцессорной обработки?

PS: я видел это sister question

+2

введите импорт вверху, следуйте по PEP 8 – tinySandy

+0

Как узнать, сколько памяти вы сохраняете с помощью предлагаемого вами метода? – gardenhead

+0

Я вижу, сколько памяти каждый процесс занимает с помощью диспетчера задач Windows. Следуя предложенному методу, родительский процесс занимает 6 Мбайт, а после PEP 8 - 36 Мб. –

ответ

1

«стандартный» способ это один сообщает PEP 8. Это то, что PEP 8 служит для: справочного руководства для кодирования в Python.

Однако есть исключение. Этот случай является одним из них.

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

Я не знаком с управлением памятью Windows, но я бы сказал, что модули разделены и не загружаются дважды. Вероятно, вы видите виртуальную память двух процессов, а не физических. В физической памяти необходимо загрузить только одну копию модулей.

Это зависит от вас, следует ли следовать PEP 8 или нет. Когда ресурсы являются ограничителем, код должен адаптироваться. Но не переустраивайте код, если не нужно! Это неправильный подход.

Смежные вопросы