首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有不同功能的多进程池

具有不同功能的多进程池
EN

Stack Overflow用户
提问于 2011-08-08 06:58:24
回答 6查看 22.2K关注 0票数 22

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

代码语言:javascript
复制
def foo(args):
   pass

if __name__ == '__main__':
   pool = multiprocessing.Pool(processes=30)
   res=pool.map_async(foo,args)

有没有办法在池中处理两个不同且独立的函数?这样你就可以分配f.e.foo()的15个进程和bar()的15个进程,或者池是否限定于单个函数?或者你必须手动为不同的功能创建不同的进程。

代码语言:javascript
复制
 p = Process(target=foo, args=(whatever,))
 q = Process(target=bar, args=(whatever,))
 q.start()
 p.start()

忘了工人泳池吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-08 07:27:11

要传递不同的函数,只需多次调用map_async即可。

这里有一个例子来说明这一点,

代码语言:javascript
复制
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))

结果将是:

代码语言:javascript
复制
>>> 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]
票数 26
EN

Stack Overflow用户

发布于 2017-05-24 17:58:43

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

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2018-11-27 01:27:24

你可以使用map或者一些lambda函数(edit:实际上你不能使用lambda函数)。您可以使用一个简单的map函数:

代码语言:javascript
复制
def smap(f, *args):
    return f(*args)

pool = multiprocessing.Pool(processes=30)
res=pool.map(smap, function_list, args_list1, args_list2,...)

normal map函数接受迭代数作为输入,这很不方便。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6976372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档