2017-02-10 5 views
0

Я делаю класс подклассами multiprocessing.Process. При выполнении некоторых тестов я заметил, что процесс не начинался с вызова start(). После некоторого тестирования выясняется, что процессы не запускаются до тех пор, пока в модуле __main__ не выполняются 2 строки кода.Процесс Python, начинающийся после двух строк кода

В качестве примера

import multiprocessing 

class Test(multiprocessing.Process): 
    def __init__(self, *args, **kwargs): 
     super(Test, self).__init__(*args, **kwargs) 
     print('created') 

    def run(self, *args, **kwargs): 
     super(Test, self).run(*args, **kwargs) 
     print('running') 

sample = Test() 
>>> created 
sample.start() 
pass # Did not start yet 
pass # Will start after this 
>>> running 

Я проверил это на различных платформах, и она работает, как ожидалось там. Я запускаю Windows 10, Python 3.5.2. Выход sys.version: '3.5.2 |Continuum Analytics, Inc.| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]'

+0

Вы всегда работаете на интерактивной сессии python? Вы получаете то же самое, когда исполняете код как скрипт из командной строки? – cdarke

+0

Кажется, что это одно и то же, будь то интерактивный сеанс, сценарий или импорт модуля. – DeepHorizons

ответ

0

Известно, что многопроцессорность ведет себя по-разному под окнами и linux. На других платформах вы подразумеваете Linux? Многопроцессорные вилки (с fork()) новый процесс в linux и дочерний процесс получает копию всех переменных и необходимой им информации, где Windows порождает новую копию интерпретатора python для каждого процесса. Здесь есть хороший ответ, объясняющий это здесь: Python Multiprocess diff between Windows and Linux

Чтобы исправить это, убедитесь, что все глобальные переменные явно переданы дочерним процессам с использованием общей памяти. Ознакомьтесь с документацией многопроцессорности: https://docs.python.org/dev/library/multiprocessing.html#sharing-state-between-processes для получения дополнительной информации.

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