Python multiprocessing.pool.pool.apply()的用例是什么?
在过去的几天里,我一直在努力掌握Python中的多处理(而不是多线程),但不理解它的用途 作为Python multiprocessing.pool.pool.apply()的用例是什么?,python,parallel-processing,apply,python-multiprocessing,Python,Parallel Processing,Apply,Python Multiprocessing,在过去的几天里,我一直在努力掌握Python中的多处理(而不是多线程),但不理解它的用途 作为Pool类的第一个方法,我假设它是默认使用的方法,但在多处理上下文中它似乎是无用的。文件内容混乱且非常简短,说明: 它将阻塞,直到结果就绪。考虑到这些块,apply_async()更适合并行执行工作 它是否只阻止为其创建的进程?如果是,那么对于大多数CPU受限的进程来说,这不是问题 此外,func仅在池的一个工作线程中执行 为什么在池类中会出现这样的情况?当我第一次读到它的时候,我以为我误解了它,但实际
Pool
类的第一个方法,我假设它是默认使用的方法,但在多处理上下文中它似乎是无用的。文件内容混乱且非常简短,说明:
它将阻塞,直到结果就绪。考虑到这些块,apply_async()更适合并行执行工作
池
类中会出现这样的情况?当我第一次读到它的时候,我以为我误解了它,但实际上似乎只有一个过程开始了如果使用专门用于多处理的类,为什么会有人想要这种行为apply\u async
,它似乎很有效,但我仍然觉得我肯定错过了apply
的一些内容,我想澄清一下
我使用的代码与此类似:
with Pool(16) as pool:
pool_results = []
for city in cities:
for street in streets:
for house in houses:
for room in rooms:
pool_results.append(pool.apply_async(func=simulate, args=(city, street, house, room)))
[result.wait() for result in pool_results]
您误解了一些事情(例如进程何时启动或启动了多少个进程),但是
Pool.apply
确实是毫无用处的。想想Pool.apply
,就像您思考Thread.run
(在不覆盖它的情况下)一样,它是一个构建块,在后台用来构建您最终想要的行为,与实际提供这种行为本身的东西相反。Python没有私有方法的一个缺点是,你可以看到表面上的一切——仅仅因为有一个方法存在并不意味着它就存在于直接的最终用户调用中。@CharlesDuffy:我不熟悉Thread.run
的细节,但是如果它真的是一个构建块,为什么它会这样呢是“高级”API的一部分吗?这似乎是一个糟糕且令人困惑的设计选择。如果您正在构建高级API,通常会构建帮助函数来支持它。它们最终成为高层呼叫支持结构的一部分;但高层电话本身并不重要。我的观点是这里没有什么问题。没有什么强迫你使用你不关心的电话,如果这些电话对你关心的打电话的人有帮助,为什么要争辩说那个人疏忽了?…我还要注意,同步apply
使人能够在一个进程块中拥有一个线程,处理在不同进程中池成员中发生的事情。如果您想在共享内存线程模型中构建UI框架,而实际工作是在多处理模型下进行的,那么这将非常方便。人们喜欢穿线而不受惩罚,这并非闻所未闻;使用多进程来转移将GIL排除在进程之外的工作,可以让您在无法编写传统的基于线程的代码时,不必编写这些代码。