2

マルチプロセッシング ( 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 から開始すると完全に正常に動作します。

4

0 に答える 0