pythonクラス内部でのマルチプロセスの実装


pythonクラス内部でのマルチプロセスの実装
作業中に自動化スクリプトを書きます.効率を高めるために、クラスの内部でマルチプロセスを開始する必要があります.コードロジックは次のとおりです.
# –*– coding: utf-8 –*–
# @Time      : 2019/3/19 21:11
# @Author    : Damon_duanlei
# @FileName  : process.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei

import time


class A(object):
    def __init__(self):
        self.a = None
        self.b = None

    def get_num_a(self):
        print("    A")
        time.sleep(3)
        self.a = 10

    def get_num_b(self):
        print("    B")
        time.sleep(5)
        self.b = 6

    def sum(self):
        print("a   :{}".format(self.a))
        print("b   :{}".format(self.b))
        ret = self.a + self.b
        return ret

    def run(self):
        self.get_num_a()
        self.get_num_b()
        print(self.sum())


if __name__ == '__main__':
    t1 = time.time()
    a = A()
    a.run()
    t2 = time.time()
    print("cost time :{}".format(t2 - t1))


実行結果:
    A
    B
a   :10
b   :6
16
cost time :8.001021385192871

単純にmultiprocessingを使用してコードを改造します.
# –*– coding: utf-8 –*–
# @Time      : 2019/3/19 21:23
# @Author    : Damon_duanlei
# @FileName  : process_01.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei

import multiprocessing
import time


class A(object):
    def __init__(self):
        self.a = None
        self.b = None

    def get_num_a(self):
        time.sleep(3)
        self.a = 10

    def get_num_b(self):
        time.sleep(5)
        self.b = 10

    def sum(self):
        print("a   :{}".format(self.a))
        print("b   :{}".format(self.b))
        ret = self.a + self.b
        return ret

    def run(self):
        p1 = multiprocessing.Process(target=self.get_num_a)
        p2 = multiprocessing.Process(target=self.get_num_b)
        p1.start()
        p2.start()
        p1.join()
        p2.join()
        print(self.sum())


if __name__ == '__main__':

    t1 = time.time()
    a = A()
    a.run()
    t2 = time.time()
    print("cost time :{}".format(t2 - t1))


実行結果:
a   :None
Traceback (most recent call last):
b   :None
TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'

因子プロセスはメインプロセスと変数を共有しないため、メインプロセスはサブプロセスで計算するデータselfを使用できない.aとself.b .マルチプロセスを知っている学生は、プロセス間の通信がパイプ、キュー、または共有メモリを借りることを知っています.比較すると、私は共有メモリの辞書(multiprocessing.Manager()を使用します.dict()は、サブプロセスで計算するデータをキー値ペアとして共有辞書に転送し、メインプロセスに戻る辞書から値を取り、対応するクラス属性に値を付与し、後続の使用を容易にする.コードは次のとおりです.
# –*– coding: utf-8 –*–
# @Time      : 2019/3/19 22:58
# @Author    : Damon_duanlei
# @FileName  : process_02.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei

import multiprocessing
import time


class A(object):
    def __init__(self):
        self.a = None
        self.b = None
        #          
        self.my_dict = multiprocessing.Manager().dict()

    def get_num_a(self):
        time.sleep(3)
        self.my_dict["a"] = 10

    def get_num_b(self):
        time.sleep(5)
        self.my_dict["b"] = 6

    def sum(self):
        self.a = self.my_dict["a"]
        self.b = self.my_dict["b"]
        print("a   :{}".format(self.a))
        print("b   :{}".format(self.b))
        ret = self.a + self.b
        return ret

    def run(self):
        p1 = multiprocessing.Process(target=self.get_num_a)
        p2 = multiprocessing.Process(target=self.get_num_b)
        p1.start()
        p2.start()
        p1.join()
        p2.join()
        print(self.sum())


if __name__ == '__main__':
    t1 = time.time()
    a = A()
    a.run()
    t2 = time.time()
    print("cost time :{}".format(t2 - t1))

実行結果:
a   :10
b   :6
16
cost time :5.442455053329468

皆さんにもっと良い方法があれば教えてください.