我知道multiprocessing.Process
类似于 threading.Thread
当我子类 multiprocessing.Process
时要创建一个进程,我发现我不必调用 __init__()
父类的方法。我写了一些测试脚本,发现了一些问题:
- _parent_pid 变量在
__init__
中初始化方法multiprocessing.Process
。但是,如果我不调用Process
的 init 方法,我仍然可以在子类中使用这个变量。
我不知道为什么,因为在我看来,如果子类化父类,如果子类不调用父类中的 init 方法,则子类只能获取父类的方法,而不能获取父类的变量。 - 为什么
threading.Thread
的子类multiprocessing.Process
的子类在做其他事情之前必须先调用父类中的init方法不是?我已经阅读了这两个类的源代码,并认为这可能是Python中的线程必须在幕后使用某种同步机制而进程则不然的原因。
第一个脚本是第一个问题演示的一部分,第二个脚本与两个问题相关:
脚本#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()
脚本#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(),))
最佳答案
如果子类没有定义__init__()
根本就是父类__init__()
被调用 - 与任何其他方法相同。您的Test
类未定义__init__()
,所以当你构造 Test
时例如,multiprocessing.Process
's(父类的)__init__()
被调用。
您的Parent/Child
例子非常不同:有 Child.__init__()
已定义。
threading.Thread
也是如此子类(或任何其他类的任何其他子类)。如果子类没有定义__init__()
无论如何,那么threading.Thread.__init__()
被调用。事实上,多年来我一直依赖它:-)
您需要调用父类__init__()
仅当子类确实定义了自己的__init__()
.
关于python - 子类 multiprocessing.Process 但不调用 multiprocessing.Process 的 __init__ 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20726539/