子类multiprocessing.Process但不调用multiprocessing.Process的__init__方法

时间:2013-12-22 05:27:54

标签: python multithreading multiprocessing

我知道multiprocessing.Process类似于threading.Thread,当我将multiprocessing.Process子类化为创建进程时,我发现我不必调用__init__()方法父类。我写了一些测试脚本并发现了一些问题:

  • _parent_pid 变量在__init__ multiprocessing.Process方法中初始化。但是,如果我不调用Process的init方法,我仍然可以在子类中使用此变量。
    我不知道为什么,因为在我看来,如果子类化父类,如果子类不在父类中调用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(),))

1 个答案:

答案 0 :(得分:1)

如果子类根本没有定义__init__(),则调用父类__init__() - 与任何其他方法相同。您的Test类未定义__init__(),因此在构建Test实例时,会调用multiprocessing.Process(父类)__init__()

您的Parent/Child示例非常不同:已定义Child.__init__()

threading.Thread子类(或任何其他类的任何其他子类)也是如此。如果子类根本没有定义__init__(),则调用threading.Thread.__init__()。实际上,我多年来一直依赖它: - )

只有当子类 定义自己的__init__()时, 才能调用父类__init__()