2017-01-31 38 views
0

我想知道是否有无论如何运行多个线程和不同的线程的结果字典分配给特定键来运行python多线程。事情是这样的:有什么办法使用字典

from joblib import Parallel, delayed 
from math import sqrt 
dict_of_sqrt = {} 
i = {'a':1,'b':2,'c':3,'e':4} 
dict_of_sqrt[k] = Parallel(n_jobs=2)(delayed(sqrt)(v**2) for k, v in i.items()) 

结果应该是字典与并行计算相同的密钥和分配新值:

dict_of_sqrt = {'a':1, 'b':1.41, 'c'=1.73, 'e'=2} 

这假设是安全的,因为我写不同的密钥(没有重叠)。但是,我还没有找到一个例子。

+0

更新了问题。 –

+0

检查多处理和池。死简单而强大。 – taesu

回答

0

如果您正在执行IO操作,那么您可以使用线程,但是如果您完成CPU密集型操作,则必须考虑GIL,因此我将改为处理。

如果你正在使用多库我认为游泳池是一个不错的对象为你,你要控制执行的线程数。为了执行该过程,您可以使用map或apply_async和回调函数。 你可以阅读更多有关地图VS apply_async这里:Python multiprocessing.Pool: when to use apply, apply_async or map?

我喜欢用队列对象将数据返回给父进程,因为它多进程/线程安全的,但它确实有去在队列过头处理结果。

这是一个基本用法的一个简单的例子。

import multiprocessing 
from Queue import Empty 
from math import sqrt 
import string 



def my_sqrt(*args): 
    k, v, q = args[0] 
    q.put({k: sqrt(v)}) 

def main(): 

    p = multiprocessing.Pool(2) 
    m = multiprocessing.Manager() 
    q = m.Queue() 

    # This is just to generate data. 
    l = [(k, (v + 1)**2, q) for v, k in enumerate(string.lowercase)] 
    p.map(my_sqrt, l) 

    # Go over the Q 
    d = dict() 
    try: 
     while 1: 
      m = q.get_nowait() 
      d.update(m) 
    except Empty: 
     pass 

    print d 

if __name__ == '__main__': 
    main() 
0

更新

from multiprocessing import Pool 
from time import sleep 
from random import choice 
import math 


# function that may take up to 5 seconds 
def myroot(t): 
    sleep(choice(range(5))) 
    return {t[0]:math.sqrt(t[1])} 

if __name__ == '__main__': 
    # dictionary keys -> n 
    # value should be n**2 
    d = {'a':1,'b':2,'c':3,'e':4} 
    dt = [(i,d[i]) for i in d] 
    # spawn 3 processes 
    pool = Pool(3) 
    # iterate all keys, feed them in sqr fuc 
    results = pool.map(myroot, dt) 
    # update object d, with result from each process 
    [d.update(i) for i in results] 
    print(d) 
+0

谢谢。我需要数值的平方,而不是键。 –

+0

您无法获得上述解决方案以满足您的需求?这很简单。并且你混合了sqaured和root,你要找的是根(n) – taesu

+0

答案已经更新,你可以清理它 – taesu

0

您可以在并行计算和返回元组对,新的密钥和值的值。在调用过程中,您只需将其转换为字典即可。

from math import sqrt 
from multiprocessing import Pool 

i = {'a':1,'b':2,'c':3,'e':4} 

# pass me to `starmap` 
def sqrtval(k, v): 
    return k, sqrt(v) 

# pass me to `map` 
def sqrtval_py2(kv): 
    k, v = kv 
    return k, sqrt(v) 

tup = Pool().starmap(sqrtval, i.items()) 
# tup = Pool().map(sqrtval_py2, i.items()) 

print(tup) 
print(dict(tup)) 

Python 2里没有一个starmap方法为multiprocessing.Pool,所以打击这个sqrtval必须接受键/值的元组,并使用该映射函数中。 python 2的替代品也提供。

相关问题