繁体   English   中英

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

[英]Subclass multiprocessing.Process but don't invoke the __init__ method of multiprocessing.Process

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

  • _parent_pid变量在multiprocessing.Process__init__方法中初始化。 但是,如果不调用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(),))

如果子类根本没有定义__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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM