具有不同功能的Mulitprocess池

dor*_*vak 18 python pool multiprocessing

多进程工作池的大多数示例在不同的进程中执行单个函数

def foo(args):
   pass

if __name__ == '__main__':
   pool = multiprocessing.Pool(processes=30)
   res=pool.map_async(foo,args)
Run Code Online (Sandbox Code Playgroud)

有没有办法在池中处理两个不同的独立功能?那么你可以为foo()分配fe 15进程,为bar()分配15个进程,或者是一个绑定到单个函数的池?或者你必须手动为不同的功能创建不同的过程

 p = Process(target=foo, args=(whatever,))
 q = Process(target=bar, args=(whatever,))
 q.start()
 p.start()
Run Code Online (Sandbox Code Playgroud)

忘了工人池?

Oca*_*res 23

要传递不同的功能,您可以简单地map_async多次调用.

这是一个例子来说明,

from multiprocessing import Pool
from time import sleep

def square(x):
    return x * x

def cube(y):
    return y * y * y

pool = Pool(processes=20)

result_squares = pool.map_async(f, range(10))
result_cubes = pool.map_async(g, range(10))
Run Code Online (Sandbox Code Playgroud)

结果将是:

>>> print result_squares.get(timeout=1)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> print result_cubes.get(timeout=1)
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
Run Code Online (Sandbox Code Playgroud)

  • `map_async`立即返回.只要池中有足够的可用进程,就可以运行新任务而无需等待.在上面的示例中,它们将并行运行.@疯狂的科学家 (3认同)
  • 它们会被并行执行还是"连续执行"? (2认同)
  • [multiprocessing Pool API](http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool)不提供在同一池中分配特定数量的工作程序的机制.如果您确实需要每个任务的特定数量的工作人员,请创建不同的池.虽然建议只有一个游泳池.我想池是应该透明地管理你的,而不用担心它. (2认同)

小智 7

它们不会并行运行。请参阅以下代码:

def updater1(q,i):    
    print "UPDATER 1:", i
    return

def updater2(q,i):    
    print "UPDATER2:", i
    return

if __name__=='__main__':
    a = range(10)
    b=["abc","def","ghi","jkl","mno","pqr","vas","dqfq","grea","qfwqa","qwfsa","qdqs"]


    pool = multiprocessing.Pool()

    func1 = partial(updater1,q)
    func2 = partial(updater2,q)
    pool.map_async(func1, a)
    pool.map_async(func2, b)

    pool.close()
    pool.join()
Run Code Online (Sandbox Code Playgroud)

上面的代码产生以下打印输出:

UPDATER 1: 1
UPDATER 1: 0
UPDATER 1: 2
UPDATER 1: 3
UPDATER 1: 4
UPDATER 1: 5
UPDATER 1: 6
UPDATER 1: 7
UPDATER 1: 8
UPDATER 1: 9
UPDATER2: abc
UPDATER2: def
UPDATER2: ghi
UPDATER2: jkl
UPDATER2: mno
UPDATER2: pqr
UPDATER2: vas
UPDATER2: dqfq
UPDATER2: grea
UPDATER2: qfwqa
UPDATER2: qwfsa
UPDATER2: qdqs
Run Code Online (Sandbox Code Playgroud)


Ray*_*mon 5

您可以使用map或一些 lambda 函数(编辑:实际上您不能使用 lambda 函数)。您可以使用一个简单的地图功能:

def smap(f, *args):
    return f(*args)

pool = multiprocessing.Pool(processes=30)
res=pool.map(smap, function_list, args_list1, args_list2,...)
Run Code Online (Sandbox Code Playgroud)

法线贴图函数以可迭代对象作为输入,不方便。

  • 这应该被接受为正确的答案,因为接受的答案以准并行模式运行(具有糟糕的规划器)。 (2认同)

ARA*_*307 5

这是@Rayamon 分享的想法的一个工作示例:

import functools

from multiprocessing import Pool


def a(param1, param2, param3):
    return param1 + param2 + param3


def b(param1, param2):
    return param1 + param2


def smap(f):
    return f()


func1 = functools.partial(a, 1, 2, 3)
func2 = functools.partial(b, 1, 2)

pool = Pool(processes=2)
res = pool.map(smap, [func1, func2])
pool.close()
pool.join()
print(res)
Run Code Online (Sandbox Code Playgroud)


Eld*_*uid 5

一池多功能

以下示例显示如何在池中运行三个函数incdec和。add

from multiprocessing import Pool
import functools

# -------------------------------------

def inc(x):
    return x + 1

def dec(x):
    return x - 1

def add(x, y):
    return x + y

# -------------------------------------

def smap(f):
    return f()

def main():
    f_inc = functools.partial(inc, 4)
    f_dec = functools.partial(dec, 2)
    f_add = functools.partial(add, 3, 4)
    with Pool() as pool:
        res = pool.map(smap, [f_inc, f_dec, f_add])
        print(res)

# -------------------------------------

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

我们有三个函数,它们在池中独立运行。我们使用 functools.partial 在执行之前准备函数及其参数。

来源: https: //zetcode.com/python/multiprocessing/