pythonクラス内部でのマルチプロセスの実装
pythonクラス内部でのマルチプロセスの実装
作業中に自動化スクリプトを書きます.効率を高めるために、クラスの内部でマルチプロセスを開始する必要があります.コードロジックは次のとおりです.
実行結果:
単純にmultiprocessingを使用してコードを改造します.
実行結果:
因子プロセスはメインプロセスと変数を共有しないため、メインプロセスはサブプロセスで計算するデータselfを使用できない.aとself.b .マルチプロセスを知っている学生は、プロセス間の通信がパイプ、キュー、または共有メモリを借りることを知っています.比較すると、私は共有メモリの辞書(multiprocessing.Manager()を使用します.dict()は、サブプロセスで計算するデータをキー値ペアとして共有辞書に転送し、メインプロセスに戻る辞書から値を取り、対応するクラス属性に値を付与し、後続の使用を容易にする.コードは次のとおりです.
実行結果:
皆さんにもっと良い方法があれば教えてください.
作業中に自動化スクリプトを書きます.効率を高めるために、クラスの内部でマルチプロセスを開始する必要があります.コードロジックは次のとおりです.
# –*– 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
皆さんにもっと良い方法があれば教えてください.