【问题标题】:python multiprocessing pool blocking main threadpython多处理池阻塞主线程
【发布时间】: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 的后果。

【问题讨论】:

    标签: python multithreading parallel-processing python-multiprocessing process-pool


    【解决方案1】:

    multiprocessing.Pool.map 阻塞 调用 线程(不一定是 MainThread!),不是整个进程。 父进程的其他线程不会被阻塞。您可以从父进程中的多个线程调用pool.map 而不会破坏任何东西(虽然没有多大意义)。这是因为Pool 在内部使用线程安全的queue.Queue,因为它是_taskqueue

    【讨论】:

    • 谢谢,感谢您提供更多详细信息。
    【解决方案2】:

    从多处理文档中,multiprocessing.map 将在执行期间阻塞主进程,直到结果准备好,而multiprocessing.map_async 不会。

    【讨论】:

    • 感谢您的回复,我在阅读时错过了这一点。
    猜你喜欢
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2014-07-01
    • 2021-05-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多