python多处理池阻塞主线程
Posted
技术标签:
【中文标题】python多处理池阻塞主线程【英文标题】:python multiprocessing pool blocking main thread 【发布时间】:2019-04-06 03:32:58 【问题描述】:我有以下 sn-p 尝试将处理拆分到多个子进程。
def search(self):
print("Checking queue for jobs to process")
if self._job_queue.has_jobs_to_process():
print("Queue threshold met, processing jobs.")
job_sub_lists = partition_jobs(self._job_queue.get_jobs_to_process(), self._process_pool_size)
populated_sub_lists = [sub_list for sub_list in job_sub_lists if len(sub_list) > 0]
self._process_pool.map(process, populated_sub_lists)
print("Job processing pool mapped")
主进程在while循环中调用搜索函数,如果队列达到阈值计数,则处理池将映射到进程函数,其中作业来自队列。我的问题是,python多处理池在执行过程中会阻塞主进程还是立即继续执行?我不想遇到“has_jobs_to_process()”评估为 true 并且在处理作业期间,它为另一组作业评估为 true 并且调用“self._process_pool.map(process,populated_sub_lists)”的情况再次,因为我不知道在进程运行时再次调用 map 的后果。
【问题讨论】:
【参考方案1】:multiprocessing.Pool.map
阻塞 调用 线程(不一定是 MainThread!),不是整个进程。
父进程的其他线程不会被阻塞。您可以从父进程中的多个线程调用pool.map
而不会破坏任何东西(虽然没有多大意义)。这是因为Pool
在内部使用线程安全的queue.Queue
,因为它是_taskqueue
。
【讨论】:
谢谢,感谢您提供更多详细信息。【参考方案2】:从多处理文档中,multiprocessing.map
将在执行期间阻塞主进程,直到结果准备好,而multiprocessing.map_async
不会。
【讨论】:
感谢您的回复,我在阅读时错过了这一点。以上是关于python多处理池阻塞主线程的主要内容,如果未能解决你的问题,请参考以下文章