[英]Subclass multiprocessing.Process but don't invoke the __init__ method of multiprocessing.Process
我知道multiprocessing.Process
与threading.Thread
类似,当我将multiprocessing.Process
子类化以创建进程时,我发现我不必调用父类的__init__()
方法。 我已经编写了一些测试脚本并发现了一些问题:
multiprocessing.Process
的__init__
方法中初始化。 但是,如果不调用Process
的init方法,我仍然可以在子类中使用此变量。 threading.Thread
的子类必须在父类中调用init方法,而在multiprocessing.Process
的子类中却不需要? 我已经阅读了这两个类的源代码,并认为这可能是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
的(父类的) __init__()
。
你的Parent/Child
的例子非常不同:有Child.__init__()
的定义。
threading.Thread
子类(或任何其他类的任何其他子类)也是如此。 如果子类根本没有定义__init__()
,则调用threading.Thread.__init__()
。 确实,多年来我一直都在依赖它:-)
你需要调用父类__init__()
仅在子类做了定义自己的__init__()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.