Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多处理池:何时使用apply、apply\u async或map?_Python_Multithreading_Concurrency_Multiprocessing - Fatal编程技术网

Python 多处理池:何时使用apply、apply\u async或map?

Python 多处理池:何时使用apply、apply\u async或map?,python,multithreading,concurrency,multiprocessing,Python,Multithreading,Concurrency,Multiprocessing,我还没有看到关于和的用例的清晰示例。我主要使用Pool.map;其他函数的优点是什么?回到Python的旧时代,要使用任意参数调用函数,可以使用apply: apply(f,args,kwargs) apply在Python2.7中仍然存在,但在Python3中没有,并且通常不再使用。如今, f(*args,**kwargs) 是首选。多处理.Pool模块试图提供类似的接口 Pool.apply类似于Pythonapply,只是函数调用是在单独的进程中执行的池。应用块,直到功能完成 Pool

我还没有看到关于和的用例的清晰示例。我主要使用
Pool.map
;其他函数的优点是什么?

回到Python的旧时代,要使用任意参数调用函数,可以使用
apply

apply(f,args,kwargs)
apply
在Python2.7中仍然存在,但在Python3中没有,并且通常不再使用。如今,

f(*args,**kwargs)
是首选。
多处理.Pool
模块试图提供类似的接口

Pool.apply
类似于Python
apply
,只是函数调用是在单独的进程中执行的<代码>池。应用块,直到功能完成

Pool.apply\u async
也类似于Python内置的
apply
,只是调用会立即返回,而不是等待结果。返回一个
AsyncResult
对象。您可以调用它的
get()
方法来检索函数调用的结果。
get()
方法阻塞,直到函数完成。因此,
pool.apply(func,args,kwargs)
相当于
pool.apply\u async(func,args,kwargs).get()

Pool.apply
不同,
Pool.apply\u async
方法还有一个回调函数,如果提供了回调函数,则在函数完成时调用。这可以用来代替调用
get()

例如:

import multiprocessing as mp
import time

def foo_pool(x):
    time.sleep(2)
    return x*x

result_list = []
def log_result(result):
    # This is called whenever foo_pool(i) returns a result.
    # result_list is modified only by the main process, not the pool workers.
    result_list.append(result)

def apply_async_with_callback():
    pool = mp.Pool()
    for i in range(10):
        pool.apply_async(foo_pool, args = (i, ), callback = log_result)
    pool.close()
    pool.join()
    print(result_list)

if __name__ == '__main__':
    apply_async_with_callback()
可能产生如下结果:

[1, 0, 4, 9, 25, 16, 49, 36, 81, 64]
注意,与
pool.map
不同,结果的顺序可能与
pool.apply\u async
调用的顺序不一致


因此,如果需要在单独的进程中运行函数,但希望当前进程在该函数返回之前阻止,请使用
Pool.apply
。像
Pool.apply
Pool.map
阻塞,直到返回完整的结果

如果希望工作进程池异步执行许多函数调用,请使用
Pool.apply\u async
。结果的顺序不保证与调用
池的顺序相同。应用异步

还请注意,您可以使用
池调用许多不同的函数。apply_async
(并非所有调用都需要使用相同的函数)

相反,
Pool.map
对许多参数应用相同的函数。
但是,与
Pool.apply\u async
不同,结果是按照与参数顺序相对应的顺序返回的。

关于
apply
vs
map

pool.apply(f,args)
f
仅在池的一个辅助进程中执行。因此池中的一个进程将运行
f(args)


pool.map(f,iterable)
:此方法将iterable分割成若干块,并作为单独的任务提交给进程池。因此,您可以利用池中的所有进程。

以下是表格格式的概述,以显示
池、应用
池、应用异步
、应用异步
池、映射
池和
池、映射异步
。选择一个参数时,必须考虑多参数、并发性、阻塞和排序:

                  | Multi-args   Concurrence    Blocking     Ordered-results
---------------------------------------------------------------------
Pool.map          | no           yes            yes          yes
Pool.map_async    | no           yes            no           yes
Pool.apply        | yes          no             yes          no
Pool.apply_async  | yes          yes            no           no
Pool.starmap      | yes          yes            yes          yes
Pool.starmap_async| yes          yes            no           no
笔记:
  • Pool.imap
    Pool.imap\u async
    ——map和map\u async的更懒惰版本

  • Pool.starmap
    方法,除了接受多个参数之外,它与map方法非常相似

  • Async
    方法一次提交所有进程,并在完成后检索结果。使用get方法获得结果

  • Pool.map
    (或
    Pool.apply
    )方法与Python内置的map(或apply)非常相似。它们阻塞主进程,直到所有进程完成并返回结果

示例: 地图 一次调用一个作业列表

results = pool.map(func, [1, 2, 3])
pool.map_async(func, jobs, callback=collect_result)
应用 只能要求一份工作

for x, y in [[1, 1], [2, 2]]:
    results.append(pool.apply(func, (x, y)))

def collect_result(result):
    results.append(result)
映射异步 一次调用一个作业列表

results = pool.map(func, [1, 2, 3])
pool.map_async(func, jobs, callback=collect_result)
应用异步 只能为一个作业调用,并在后台并行执行作业

for x, y in [[1, 1], [2, 2]]:
    pool.apply_async(worker, (x, y), callback=collect_result)
星图 是支持多个参数的
pool.map
的变体

pool.starmap(func, [(1, 1), (2, 1), (3, 1)])
星图异步 starmap()和map_async()的组合,迭代iterable中的iterable并在iterable解包时调用func。返回一个结果对象

pool.starmap_async(calculate_worker, [(1, 1), (2, 1), (3, 1)], callback=collect_result)
参考:
在这里可以找到完整的文档:

在Windows上,如果在
使用回调()应用异步(apply_async)之前
,那么在
中是否应该有
。map\u async怎么样?看看里面,你会看到
Pool.map(func,iterable)
相当于
Pool.map\u async(func,iterable).get()
。因此,
Pool.map
Pool.map\u async
之间的关系类似于
Pool.apply
Pool.apply\u async
之间的关系。
async
命令立即返回,而非
async
命令阻塞。
async
命令也有一个回调。决定使用
Pool.map
Pool.apply
类似于决定在Python中何时使用
map
apply
。你只需要使用适合工作的工具。使用
async
和非
async
版本取决于您是否希望调用阻止当前进程和/或是否希望使用回调。@false:Yes。对
apply\u async
的每次调用都返回一个
ApplyResult
对象。调用
ApplyResult
get
方法将返回相关函数的返回值(或者如果调用超时,则提升
mp.TimeoutError
),因此如果将
ApplyResult
放入有序列表中,则调用它们的
get
方法将以相同的顺序返回结果。您可以使用
pool.map