Разница между Process.run () и Process.start () - PullRequest
1 голос
/ 10 марта 2019

Я изо всех сил пытаюсь понять разницу между run() и start().Согласно документации, метод run() вызывает вызываемый объект, переданный в конструктор объекта, а метод start() запускает процесс и может вызываться только один раз.

Я попробовал пример ниже:

def get_process_id(process_name):
    print process_name, os.getpid()

p1 = multiprocessing.Process(target=get_process_id, args=('process_1',))
p2 = multiprocessing.Process(target=get_process_id, args=('process_2',))

p1.run()
p2.run()
p1.start()
p2.start()

Результаты приведены ниже:

process_1 35138
process_2 35138
process_1 35141
process_2 35142

Когда я использую run(), это показывает, что p1 и p2 используют один и тот же процесс.Но когда я использую start(), они дают две разницы.Это потому, что вызов run() не имеет ничего общего с вызывающим его процессом, а просто вызывает функцию (в данном примере это get_process_id)?

Ответы [ 3 ]

1 голос
/ 10 марта 2019

Вы не должны вызывать process.run() явно. Это метод, который вызывает указанную вами target функцию, если только вы не переопределите ее, когда подкласс Process. Обычно он вызывается внутри нового потомка, пока загружается. Он не делает ничего, кроме вызова целевой функции.

# multiprocessing.process.BaseProcess

def run(self):
    '''
    Method to be run in sub-process; can be overridden in sub-class
    '''
    if self._target:
        self._target(*self._args, **self._kwargs)

Когда вы вызываете его в родительском процессе, он выполняется в вашем родительском процессе, как и любой другой метод.

process.start() - это метод, который вы должны вызывать у своего родителя для создания нового процесса.

1 голос
/ 10 марта 2019

Invoking start() создаст новый поток и выполнит run() в этом новом потоке. Принимая во внимание, что вызов run() сам выполнит его в текущем потоке. Выполнение run() не переключится на другой поток. Таким образом, он выполнит свои действия в основном потоке.

1 голос
/ 10 марта 2019

Ты совершенно прав. Как описано в документах , run() является точкой входа нового потока, созданного start().

...