大規模なデータベースを処理する必要のあるメソッドがあります。 を掘るのに数時間かかります。引数は(最大)Xの処理対象の(長い)リストに格納されています1バッチ。メソッドは何も返す必要はありませんが、私は "fun"の "True"を返します。python apply_asyncはメソッドを呼び出さない
私はそれを線形的に反復しているとき、関数は完全に動作していますここで)、apply_asyncまたはmap_asyncの作業を行うことができません。 (以前は他のプロジェクトでも働いていました) 私は何が間違っているのか、何らかのヒントがあれば感謝します。 以下のコードを参照してください:
import multiprocessing as mp
class mainClass:
#loads of stuff
def main():
multiprocess = True
batchSize = 35
mC = mainClass()
while True:
toCheck = [key for key, value in mC.lCheckSet.items()] #the tasks are stored in a dictionary, I'm referring to them with their keys, which I turn to a list here for iteration.
if multiprocess == False:
#this version works perfectly fine
for i in toCheck[:batchSize]:
mC.check(i)
else:
#the async version does not, either with apply_async...
with mp.Pool(processes = 8) as pool:
temp = [pool.apply_async(mC.check, args=(toCheck[n],)) for n in range(len(toCheck[:batchSize]))]
results = [t.get() for t in temp]
#...or as map_async
pool = mp.Pool(processes = 8)
temp = pool.map_async(mC.check, toCheck[:batchSize])
pool.close()
pool.join()
if __name__=="__main__":
main()
あなたはjsbuenoありがとう!いいえ、印刷物も実行されません。 mCには、check関数によって操作されるべき巨大なリストがいくつかあります。私はそれが彼らに何らかの変更を加えないことに気づいたので、あなたのヒント(彼らは同じインスタンスに接続されていません)が正しい方向かもしれません。同じ理由で、再インスタンス化でも残念ながら解決できません。 私の現在の回避策は、mCのテーブルを直接操作するのではなく、結果をフィードバックするようにcheck()を書き直すことです。できます。 しかし、もし私がそれらをmCのリストを直接操作できるようにするにはどうすればいいのかまだ分かりません。 – Adam
続き:最初の例のように、チェックでテーブル(self.value = 1)を読み取ることができますが、それを書きたいと思います。それは何らかの理由で発生しません。 – Adam