2

我想用 py2exe冻结我的程序,其中包括一个使用多处理 ( http://pyevolve.sourceforge.net/ ) 的库。这工作得很好;我可以运行生成的 .exe 并且(在禁用多处理的情况下)我的程序执行我期望它执行的操作。

启用多处理时会出现我的问题。起初,我的程序对每个 CPU 内核都完全重新启动。我通过添加freeze_support()到创建进程池的库来解决这个问题。这解决了一个问题,但又产生了另一个问题:现在池中的每个工作人员都会创建以下 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

当从我的 IDE 启动但不是通过生成的 .exe 时,代码工作得非常好。

4

0 回答 0