我目前正在編寫一個使用多線程的程序。爲了能夠跨這些線程共享數據,我使用像threading.Lock這樣的Lock來避免運行期間的訪問問題。從不同線程讀取數據可能會出錯
但是,我得到的問題是,我必須爲每個數據創建大量的鎖來讀取數據。即使我對數據進行「分組」,並使用相同的鎖,但數量太多。所以我問自己:如果一個線程只是讀取數據,並沒有改變它(這也適用於所有其他線程),是否有任何可能發生的問題?
由於提前,
我目前正在編寫一個使用多線程的程序。爲了能夠跨這些線程共享數據,我使用像threading.Lock這樣的Lock來避免運行期間的訪問問題。從不同線程讀取數據可能會出錯
但是,我得到的問題是,我必須爲每個數據創建大量的鎖來讀取數據。即使我對數據進行「分組」,並使用相同的鎖,但數量太多。所以我問自己:如果一個線程只是讀取數據,並沒有改變它(這也適用於所有其他線程),是否有任何可能發生的問題?
由於提前,
如果所有的線程只是讀取數據,有來自不同的線程同時訪問數據時,只要讀取數據並沒有改變它沒有問題。更改讀取數據可能會出現在某些數據結構中,defaultdict
是一個棘手的示例。
如果您有消費者\生產者場景,請考慮使用Queue.Queue
,這是一種允許同時讀寫的線程安全數據結構。從Python documentation:
def worker():
while True:
item = q.get()
do_work(item)
q.task_done()
q = Queue()
for i in range(num_worker_threads):
t = Thread(target=worker)
t.daemon = True
t.start()
for item in source():
q.put(item)
q.join() # block until all tasks are done
假設你有50個線程。只要單個線程能夠寫入數據,則任何其他讀取數據的線程都可能產生問題。
例如,一個線程寫入數據,然後另一個讀取數據。如果存在併發問題,它會在更改之前或之後讀取數據。你將無法識別這一點。
只有當每個線程剛剛讀取,你都不會有問題。
我相信你只需要鎖定,如果你寫這意味着如果你有20個線程讀取只有一個寫作,那麼你只需要鎖定時,寫入一個工作減少21個鎖定線程只有一個