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

标签 python multithreading multiprocessing

我知道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/

相关文章:

python - except 和 except BaseException 有什么区别

python - 在基于 trio 的 Python 应用程序中生成进程并在进程之间进行通信

python - 安装Matplotlib : Command "python setup.py egg_info" failed with error code 1 (proposed solutions did not work)

java - weblogic内置分布式同步工具

python - 通过多处理减少内存占用?

python multiprocessing,管理器启动进程生成循环

python - 访问 apply 内的 groupby 值

c - 等待线程创建

java - 尝试在 Transform() 中加载图像时 Glide 卡住

python-3.x - 在父进程中捕获子进程异常