簡単なスレッド処理の実装
前回作ったYoutubeダウンロード処理を並列化するために、
ちと調べてみました。
まあ、ダウンロードは既に終わっているのですが、次回のためにお勉強お勉強。
#! /usr/bin/python # -*- encoding: utf-8 -*- from __future__ import unicode_literals from multiprocessing import Pool import random import time class Test(): """並列処理したい処理のクラス""" def __init__(self, type_name = "hoge"): self.type_name = type_name def run(self): for i in range(1,random.randint(3, 10)): time.sleep(1) print "%s :%s %s" %(self.type_name," "*i,i) return "%s end" % self.type_name def make_child(name = "hoge"): """子プロセスの生成関数""" t = Test(name) return t.run() def make_mother(max_child): """並列処理時の親クラス""" # プロセスのプールを作成 p = Pool(max_child) # 戻り値のリスト = p.map(子プロセスの生成関数, 子プロセスへの引数のリスト) list = p.map(make_child, range(10)) return list if __name__ == '__main__': print make_mother(4)
上記サンプルだと、理由はよく分からないが、複雑な処理だとエラーになるようです。。。。
現在は以下サイトの自作MyPoolクラスを、改良して使用させて頂いています。
【参考元】Pythonでクラス内の関数を並列演算させる - 技術の切れはし
【少し効率を上げた改良版】簡単なスレッド処理の実装2