Python Pool.map()未终止,但仅在调试模式下终止
这不是我第一次在调试某些东西时遇到Python Pool.map()未终止,但仅在调试模式下终止,python,python-multiprocessing,Python,Python Multiprocessing,这不是我第一次在调试某些东西时遇到Pool()问题 请注意,我不尝试调试并行化的代码。我想调试代码,这些代码执行得要晚得多。问题是,从未到达此代码,原因是pool.map()未终止 我创建了一个简单的管道,它可以做一些事情。其中包括一个非常简单的文本数据预处理步骤 为了加快速度,我正在跑步: print('Preprocess text') with Pool() as pool: df_preprocessed['text'] = pool.map(preprocessor.prepr
Pool()
问题
请注意,我不尝试调试并行化的代码。我想调试代码,这些代码执行得要晚得多。问题是,从未到达此代码,原因是pool.map()
未终止
我创建了一个简单的管道,它可以做一些事情。其中包括一个非常简单的文本数据预处理步骤
为了加快速度,我正在跑步:
print('Preprocess text')
with Pool() as pool:
df_preprocessed['text'] = pool.map(preprocessor.preprocess, df.text)
但问题是:
出于某种原因,此代码只运行一次。第二次,我在pool.py
模块的\u handle\u workers()
中陷入了无休止的循环:
@staticmethod
def _handle_workers(pool):
thread = threading.current_thread()
# Keep maintaining workers until the cache gets drained, unless the pool
# is terminated.
while thread._state == RUN or (pool._cache and thread._state != TERMINATE):
pool._maintain_pool()
time.sleep(0.1)
# send sentinel to stop workers
pool._taskqueue.put(None)
util.debug('worker handler exiting')
注意while
-循环。第二次调用预处理函数时,我的脚本就到此结束了
请注意:这仅在调试会话期间发生!如果脚本在没有调试器的情况下执行,则一切正常
这可能是什么原因
环境
$python--版本
Python 3.5.6::Anaconda公司。
更新 这可能是一个已知的bug
preprocess()
(第一行)中调用print()
,显示它第一次运行,但第二次就不再执行了。所以pool.map()
什么都不做。你用pdb作为调试器吗?@AlexanderCécile Hm,这是个好问题。我使用的是PyCharm,它使用的是miniconda环境(Python 3.5.6)-不太确定它使用的是哪种调试器。您是否尝试过专家程序员的诊断技术,在任何地方都使用打印语句?哪个操作系统?您是第二次重新创建池还是使用现有池?@AlexanderCécile Yes-首选武器:高度复杂的标准输出信号调试。我很确定现在已经好了。在preprocess()
(第一行)中调用print()
,显示它第一次运行,但第二次就不再执行了。所以pool.map()
什么都不做。