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多处理池阻塞主线程的主要内容,如果未能解决你的问题,请参考以下文章

.NET - 阻塞主线程,直到有任何可用线程

Python多线程守护线程 & 阻塞线程

python 非阻塞模式 线程池

python 非阻塞模式 线程池

Python静态Web服务器-多任务版

Python_线程线程效率测试数据隔离测试主线程和子线程