2013-12-22 3 views
1

Я знаю multiprocessing.Process аналогично threading.Thread и когда я подкласс multiprocessing.Process создать процесс, я считаю, что я не должен вызывать __init__() метод родительский класс. Я написал несколько тестовых сценариев и найти какие-то проблемы:Подкласс multiprocessing.Process, но не вызывать метод __init__ из multiprocessing.Process

  • Переменная _parent_pid инициализируется в __init__ методом multiprocessing.Process. Однако, если я не вызываю метод init из Process, я все равно могу использовать эту переменную в подклассе.
    Я не знаю почему, поскольку, на мой взгляд, если подклассификация родительского класса, подкласс может получить только методы родителя, но не переменные родительского, если подкласс не вызывает метод init в родительском классе ,
  • Почему подкласс threading.Thread должен вызвать метод init в родительском классе, прежде чем делать другие вещи, в то время как подкласс multiprocessing.Process нет? Я прочитал исходный код обоих классов и думаю, что это может быть причиной того, что потоки на Python должны использовать какой-то синхронный механизм под капотом, а процессы - нет.

Первый сценарий является частью демонстрации первой задачи и второй сценарий связан с двумя проблемами:

Script # 1:

#!/usr/bin/env python2.7 
# -*- coding: utf-8 -*- 

class Parent(object): 
    def __init__(self): 
     self.parent = 'parent' 

    def myprint(self): 
     print('Hi') 


class Child(Parent): 
    def __init__(self): 
     # super(Child, self).__init__() 
     self.myprint() 

    def print_parent(self): 
     try: 
      print(self.parent) 
     except Exception: 
      print('No such a variable self.parent.') 

if __name__ == '__main__': 
    child = Child() 
    child.print_parent() 

Script # 2:

#!/usr/bin/env python2.7 
# -*- coding: utf-8 -*- 

import os 
import time 
import multiprocessing 

class Test(multiprocessing.Process): 

    # def __init__(self): 
    #  super(Test, self).__init__() 

    def run(self): 
     while True: 
      print('process: %s, pid: %d, ppid: %d' % (self.name, self.pid, self._parent_pid)) 
      time.sleep(2) 

if __name__ == '__main__':  
    for i in xrange(3): 
     process = Test() 
     process.start() 

    print('My pid is %d' % (os.getpid(),)) 

ответ

1

Если подкласс не определяет __init__() вообще, вызывается родительский класс __init__() - тот же, что и для любого другого r метод. Ваш класс Test не определяет __init__(), поэтому, когда вы создаете экземпляр Test, вызывается multiprocessing.Process (родительский класс) __init__().

Ваш Parent/Child пример совсем другой: там Child.__init__()is определено.

То же самое относится к подклассам threading.Thread (или любым другим подклассам любого другого класса). Если подкласс вообще не определяет __init__(), то вызывается threading.Thread.__init__(). На самом деле, я обычно полагался на том, что в течение многих лет :-)

Вам необходимости вызвать родительский класс __init__() только если подкласс делает определить свою собственную __init__().

+0

О, да! Две проблемы вызваны моим неполным пониманием инициализации класса в Python. Большое спасибо! – flyer

+0

Основная точка приема :-) заключается в том, что здесь нет ничего особенного в '__init __()': он следует тем же правилам (в этом отношении), что и все методы класса. –

+0

Означает ли это, что при создании экземпляра класса интерпретатор Python сначала создает экземпляр класса, а затем пытается вызвать метод init в классе и если нет метода init, он будет искать его в родительском класс и попытаться вызвать его? – flyer

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