簡體   English   中英

Python多線程錯誤

[英]Error in Python multi-threading

我使用多線程進行計算:

def calc_score(score, i, j, a, b):
    score[i, j] = func(a, b)

if __name__ == '__main__':
    df = pd.read_excel('df.xlsx')
    db = pd.read_csv('db2.csv', converters= {'create_date': pd.to_datetime})

    m = len(df)
    n = len(db)
    pool = Pool(multiprocessing.cpu_count())
    score = np.zeros([m, n])
    for i in range(m):
        a = df.loc[i, 'val']
        if a == 'None' or a == '':
            score[i, :] = 0
        else:
            for j in range(n):
                b = db.loc[j, 'val']
                pool.apply_async(calc_score, (score, i, j, a, b))#multi-threading
    pool.close()
    pool.join()

我收到一條錯誤消息:

Traceback (most recent call last):
File "C:\main.py", line 107, in <module>
File "C:\Program Files\Python36\lib\multiprocessing\pool.py", line 356, in apply_async
File "C:\Program Files\Python36\lib\multiprocessing\pool.py", line 620, in __init__
RuntimeError: can't allocate lock

原因是什么,如何解決?

我可以使用互斥鎖來鎖定該部分嗎?

更新:

mutex = threading.Lock() 
def calc_score(score, i, j, a, b):
    with mutex:
        score[i, j] = func(a, b)

我想問題是試圖直接共享一個numpy矩陣。

我看到這些選項。

  • 為每個任務制作一個單獨的矩陣片段,然后縫制它們。
  • 使用顯式的內存共享,例如通過multprocessing.Array ,但是對於numpy,它必須使用一些其他技巧。
  • 如果訪問模式不能很好地分區,請使用內存中的鍵值數據庫(redis,unqlite甚至sqlite),然后將結果存儲為(坐標元組,值)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM