は、私がこのようないくつかの処理を、行うために使用するクラスの内部にいくつかのプロセスとプールがあるとします。マルチプロセッシング、pool.readyは何をしますか?
class MyClass:
def __init_(self):
self.pool = Pool(processes = NUM_PROCESSES)
self.pop = []
self.finished = []
def gen_pop(self):
self.pop = [ self.pool.apply_async(Item.test, (Item(),)) for _ in range(NUM_PROCESSES) ]
while (not self.check()):
continue
# Do some other stuff
def check(self):
self.finished = filter(lambda t: self.pop[t].ready(), range(NUM_PROCESSES))
new_pop = []
for f in self.finished:
new_pop.append(self.pop[f].get(timeout = 1))
self.pop[f] = None
# Do some other stuff
私はこのコードを実行すると、私は<type 'function'>
ができないと述べてcPickle.PicklingError
を取得しますピックルされる。これは、apply_async
関数の1つがまだ返されていないので、実行中の関数を別のリストに追加しようとしていることを示しています。しかし、実行中のすべての呼び出しがready()
関数を使用してフィルタにかけられている必要があるため、これは起こってはなりません。
Item
クラスの実際の性質は重要ではありませんが、私のItem.test
関数の先頭には、デバッグの目的で起動するprint文があります。しかし、それは起こらない。これは、関数が開始されたが、実際には実行を開始していないことを示しています。
それで、ready()
は、呼び出しが実行を終了したかどうかを実際に教えてくれないようです。 ready()
とは何を正確に実行するのですか?まだ実行中のプロセスを除外できるようにコードを編集する方法はありますか?
なぜ「cPickle.PicklingError」はそれを意味すると思いますか? – zwol
@zwol正直なところ私はしません。むしろ、私はエラーが私の質問で詳述された実際の問題の症状だと思う。 – Woody1193
私が言っていることは、あなたの実際の問題の診断が間違っていると思います。 – zwol