ロックを解放するようなことは、メソッドで行うべきことではありません。ロックを確実に解放するには、ステートメント__del__
でコンテキストマネージャーとしてロックを使用することをお勧めします。with
さらに、生成されたクラスのインスタンスは異なるプロセスに存在します。サブプロセスで何かを変更しても、もちろんIPCに使用されるオブジェクト(キュー、パイプ、ロックなど)を除いて、他のサブプロセスには影響しません。マルチプロセッシングモジュール)。
もう1つは、メインプロセスに返されるインスタンスは、サブプロセスで作成されたインスタンスと同じではないということです。マルチプロセッシングの戻り値は、子プロセスでピクルスにされ、親に送信され、そこでアンピクルされます。このプロセスには*が含まれForkingPickler
ます。したがって__del__
、同じインスタンスで複数回呼び出されるのではなく、異なるサブプロセスの異なるインスタンスで呼び出されます。
*:ここで何が起こっているのか完全にはわかりません。誰か他の人がもっと知っているかもしれません...しかし、例の別のバージョンが役立つかもしれません:
import multiprocessing
import time
import os
class myclass(object):
def __init__(self,val):
self.val=val
print ("Initializing %s - %s - %s" % (str(self.val), self, os.getpid()))
def __del__(self):
print ("Deleting %s - %s - %s" % (str(self.val), self, os.getpid()))
if __name__ == "__main__":
p = multiprocessing.Pool(3)
obj_list=p.map(myclass,range(5))
del p
for o in obj_list:
print ("Returned %s - %s - %s" % (str(o.val), o, os.getpid()))
出力:
Initializing 0 - <__main__.myclass object at 0x7f2497fdc0d0> - 7574
Initializing 2 - <__main__.myclass object at 0x7f2497fdc110> - 7574
Deleting 0 - <__main__.myclass object at 0x7f2497fdc0d0> - 7574
Initializing 1 - <__main__.myclass object at 0x7f2497fdc150> - 7575
Initializing 3 - <__main__.myclass object at 0x7f2497fdc1d0> - 7575
Deleting 1 - <__main__.myclass object at 0x7f2497fdc150> - 7575
Initializing 4 - <__main__.myclass object at 0x7f2497fdc0d0> - 7574
Deleting 2 - <__main__.myclass object at 0x7f2497fdc110> - 7574
Returned 0 - <__main__.myclass object at 0x7f2497fdc650> - 7573
Returned 1 - <__main__.myclass object at 0x7f2497fdc7d0> - 7573
Returned 2 - <__main__.myclass object at 0x7f2497fdc810> - 7573
Returned 3 - <__main__.myclass object at 0x7f2497fdc850> - 7573
Returned 4 - <__main__.myclass object at 0x7f2497fdc890> - 7573
Deleting 3 - <__main__.myclass object at 0x7f2497fdc1d0> - 7575
Deleting 4 - <__main__.myclass object at 0x7f2497fdc890> - 7573
Deleting 3 - <__main__.myclass object at 0x7f2497fdc850> - 7573
Deleting 2 - <__main__.myclass object at 0x7f2497fdc810> - 7573
Deleting 1 - <__main__.myclass object at 0x7f2497fdc7d0> - 7573
Deleting 0 - <__main__.myclass object at 0x7f2497fdc650> - 7573
異なるプロセスとオブジェクトIDに注意してください