2017-01-31 28 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的替代品也提供。

相關問題