Python Multiprocess
code:python
from multiprocessing import Pool
import time
from functools import partial
class DataProcessor:
def __init__(self):
self.common_data = "shared_data"
self.multiplier = 2
def process_item(self, item):
"""インスタンスメソッド: インスタンス変数にアクセス可能"""
time.sleep(0.1) # 処理時間をシミュレート
return f"Processed {item} * {self.multiplier} with {self.common_data}"
def process_parallel_method1(self, items, num_processes=4):
"""方法1: partialを使用してインスタンスメソッドを渡す"""
with Pool(processes=num_processes) as pool:
# partialを使用してself.process_itemを部分適用
func = partial(self.process_item)
results = pool.map(func, items)
return results
@classmethod
def pool_initializer(cls, processor_instance):
"""プール初期化時にインスタンスをグローバル変数として設定"""
global processor
processor = processor_instance
def worker_function(self, item):
"""グローバルインスタンスを使用する作業関数"""
return processor.process_item(item)
def process_parallel_method2(self, items, num_processes=4):
"""方法2: 初期化関数でインスタンスを共有"""
with Pool(processes=num_processes,
initializer=self.pool_initializer,
initargs=(self,)) as pool:
results = pool.map(self.worker_function, items)
return results
# 使用例
if __name__ == '__main__':
processor = DataProcessor()
items = list(range(5))
# 方法1: partialを使用
print("方法1: partialを使用した並列処理")
start_time = time.time()
results1 = processor.process_parallel_method1(items)
print(f"処理時間: {time.time() - start_time:.2f}秒")
print("結果:", results1)
print("\n方法2: 初期化関数でインスタンスを共有")
start_time = time.time()
results2 = processor.process_parallel_method2(items)
print(f"処理時間: {time.time() - start_time:.2f}秒")
print("結果:", results2)
# 比較用の逐次処理
print("\n逐次処理")
start_time = time.time()
print(f"処理時間: {time.time() - start_time:.2f}秒")
print("結果:", results_seq)