マルチプロセッシング ( http://pyevolve.sourceforge.net/ ) を使用するライブラリを含むプログラムを py2exe でフリーズしたいと考えています。これは問題なく機能します。生成された .exe を実行することができ、(マルチプロセッシングを無効にして) 私のプログラムは期待通りの動作をします。
マルチプロセッシングが有効になっていると、問題が発生します。最初に、私のプログラムはすべての CPU コアに対して完全に再起動されました。freeze_support()プロセスプールが作成されるライブラリに追加することで、これを修正しました。これにより、1 つの問題が修正されましたが、別の問題が発生しました。プール内のすべてのワーカーが次の AttributeError を作成するようになりました。
Process PoolWorker-XY:
Traceback (most recent call last):
File "multiprocessing\process.pyc", line 258, in _bootstrap
File "multiprocessing\process.pyc", line 114, in run
File "multiprocessing\pool.pyc", line 102, in worker
File "multiprocessing\queues.pyc", line 378, in get
AttributeError: 'module' object has no attribute 'my_multiprocessing_fct'
これは、マルチプロセッシングが開始されるライブラリの一部です。
...
if self.multiProcessing[0] and MULTI_PROCESSING:
proc_pool = Pool(processes=self.multiProcessing[2])
if self.multiProcessing[1]:
results = proc_pool.map(multiprocessing_eval_full, self.internalPop)
proc_pool.close()
proc_pool.join()
...
else:
results = proc_pool.map(multiprocessing_eval, self.internalPop)
proc_pool.close()
proc_pool.join()
...
...
そして、コードの上に追加した freeze_support() :
try:
from multiprocessing import cpu_count, Pool, freeze_support
freeze_support()
CPU_COUNT = cpu_count()
MULTI_PROCESSING = True if CPU_COUNT > 1 else False
except ImportError:
MULTI_PROCESSING = False
コードは、生成された .exe 経由ではなく、IDE から開始すると完全に正常に動作します。