我想用 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 时,代码工作得非常好。