2011-04-03 42 views
0

我目前正在編寫一個使用多線程的程序。爲了能夠跨這些線程共享數據,我使用像threading.Lock這樣的Lock來避免運行期間的訪問問題。從不同線程讀取數據可能會出錯

但是,我得到的問題是,我必須爲每個數據創建大量的鎖來讀取數據。即使我對數據進行「分組」,並使用相同的鎖,但數量太多。所以我問自己:如果一個線程只是讀取數據,並沒有改變它(這也適用於所有其他線程),是否有任何可能發生的問題?

由於提前,

回答

0

如果所有的線程只是讀取數據,有來自不同的線程同時訪問數據時,只要讀取數據並沒有改變它沒有問題。更改讀取數據可能會出現在某些數據結構中,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 
0

假設你有50個線程。只要單個線程能夠寫入數據,則任何其他讀取數據的線程都可能產生問題。

例如,一個線程寫入數據,然後另一個讀取數據。如果存在併發問題,它會在更改之前或之後讀取數據。你將無法識別這一點。

只有當每個線程剛剛讀取,你都不會有問題。

0

我相信你只需要鎖定,如果你寫這意味着如果你有20個線程讀取只有一個寫作,那麼你只需要鎖定時,寫入一個工作減少21個鎖定線程只有一個

相關問題