Я знаю 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(),))
О, да! Две проблемы вызваны моим неполным пониманием инициализации класса в Python. Большое спасибо! – flyer
Основная точка приема :-) заключается в том, что здесь нет ничего особенного в '__init __()': он следует тем же правилам (в этом отношении), что и все методы класса. –
Означает ли это, что при создании экземпляра класса интерпретатор Python сначала создает экземпляр класса, а затем пытается вызвать метод init в классе и если нет метода init, он будет искать его в родительском класс и попытаться вызвать его? – flyer