2012-09-14 64 views
1

剛開始的時候,python新增了多線程的整個概念。我在多線程寫入文件時遇到問題。如果我按常規方式來做,它會不斷覆蓋正在寫入的內容。在多線程中寫入文件

什麼是使用說5線程寫入文件的正確方法?

回答

2

不降低性能的最好方法是在所有線程之間使用一個隊列,每個線程都會佔用一個項目,而一個主線程只會將一個項目取出並寫入一個文件,該隊列是線程安全的並阻止當它爲空時,或者如果可能時更好,只需返回5個線程中的所有值,然後將其寫入文件,則IO往往是我們可以做的更昂貴的操作之一,所以最好限制它我們可以。

另請注意,如果您要利用多個處理引擎,python中的線程不會利用多核心,原因GIL,而是使用multiprocessing

這裏是一個簡單的例子:

from multiprocessing import Process, Queue 

def test_1(q): 
    for i in range(10): 
     q.put('test_1: ' + str(i)) 

def test_2(q): 
    for i in range(10): 
     q.put('test_2: ' + str(i)) 

q = Queue() 
p1 = Process(target=test_1, args=(q,)) 
p2 = Process(target=test_2, args=(q,)) 
p1.start() 
p2.start() 

with open('test.txt', 'w') as file: 
    while p1.is_alive() or p2.is_alive() or not q.empty(): 
     try: 
      value = q.get(timeout = 1) 
      file.write(value + '\n') 
     except Exception as qe: 
      print "Empty Queue or dead process" 
p1.join() 
p2.join() 

test.txt內容:

test_1: 0 
test_1: 1 
test_1: 2 
test_1: 3 
test_1: 4 
test_2: 0 
test_1: 5 
test_2: 1 
test_1: 6 
test_2: 2 
test_1: 7 
test_2: 3 
test_1: 8 
test_2: 4 
test_1: 9 
test_2: 5 
test_2: 6 
test_2: 7 
test_2: 8 
test_2: 9 
+0

謝謝!非常詳細的答案,我現在就試試這個 – nick

+0

@nick很高興我可以幫忙,看看http://docs.python.org/library/multiprocessing.html#using-a-pool-of-workers它傾向於在map-reduce模式下使用python進行多處理的最低調的方式。 –

1

一種方法是鎖定文件,以便一次只有一個線程可以訪問它;檢查threading.Lock

+0

如果其他線程需要時,它的鎖定寫入文件? – nick

+0

@nick:它會一直等到鎖被釋放。 – houbysoft

+0

整個線程是否會等待寫入,還是繼續執行它應該執行的操作? – nick