2010-02-28 106 views
2

在回答之前,請理解我不希望你爲我完成這項工作。對於我的(可能是理論上的)問題存在的原因以及對解決此問題的過程的解釋,我寧願讚賞一個措辭的答案。當有人爲我做這項工作時,我發現很難正確地學習。先謝謝你。python函數是線程安全嗎? (特別是這個?)

我有這個功能:它完全看起來像是在做什麼。它使用來自包含Facebook ID並返回ID的頁面中的HTML。

def getID(data): #Find an ID from HTML input. 
    data = str(data) 
    appstring = 'http://apps.facebook.com/castle_age/keep.php?user=' #We're gonna find this in the html. 
    appstr_start_pos = data.find(appstring) #Tell us where we found it oh mighty one! 
    if appstr_start_pos != -1: #If we find it. 
     begin_ID_pos = appstr_start_pos + len(appstring) 
     end_ID_pos = data.find('"', begin_ID_pos) #Find the end quote, that'll be the end of our ID string. 

     our_ID = data[begin_ID_pos:end_ID_pos] 
     return our_ID 

現在我沒有它裝在我的課,它使用thread.Threading方法之一,但我仍然經常調用它。我的代碼現在只運行一個線程,可能我需要從另一個線程類調用此函數;這可能嗎?如果不是,我怎麼能在線程類之間使用這個函數?

問題的一個更簡單的形式:如果我從多線程環境調用這個函數,我會遇到問題,還是需要將它移動到它自己的類中?有沒有辦法讓函數在2個不同的線程對象之間保持可用(如果是的話,最簡單的方法是什麼)?

下面是完整的代碼:http://pastebin.com/txH8PvL3 - 請記住,這是一個在製品,如實踐學習線程...

+1

「瞭解Python GIL」http://www.dabeaz.com/python/UnderstandingGIL.pdf描述了Python線程的工作原理 – jfs 2010-02-28 22:39:00

+0

我最近閱讀了很多有關GIL的內容,尤其是davids使用優先級線程工作,以便在Python 3.2 GIL中有一個線程IO綁定和另一個CPU綁定時解決CPU/IO綁定問題。但是,當python調用一個函數...它做了該函數的COPY? (所以如果函數被調用(只要它不修改函數上面的某個作用域),它不會與另一個同時調用它的線程發生衝突? – ThantiK 2010-02-28 22:46:18

回答

7

問題的更簡單的形式:如果我把這個功能從多線程環境中,我都會有問題,

是的,它是線程安全的,從我可以告訴

或者我需要將它移動到自己的類?

線程安全性與類無關:它與共享狀態有關。如果線程共享狀態,則必須規定以線程安全的方式訪問/變更此狀態,即使用鎖。

+1

+1:該函數似乎只是獲取事物並如果另一個函數同時更新'data',那麼你將會遇到線程安全問題。 – 2010-02-28 22:33:09

+0

所以,爲了澄清一下,如果我有兩個線程同時調用getID,並且它們都以自己的方式分別傳遞字符串對象,這不會失敗? – ThantiK 2010-02-28 22:38:26

+2

@Thantik:正確。該函數不會改變任何共享狀態。 – jldupont 2010-02-28 22:47:01

0

內置函數len(),str()用於您的函數可以在其他線程中進行猴子修補。

+1

我沒有人需要關心* data *。它可能是一個可變對象,在這種情況下,它的字符串表示形式正在由數據.__ str __()返回,這會創建一個新對象,或者* data *已經是一個字符串,這仍然很酷,因爲Python字符串是不可變的。所以,如果另一個線程修改數據並不重要,它在getID()中應該沒有副作用。 – 2010-02-28 23:05:55

0

這並不容易,因爲每個get*()函數都可以使用緩存。因此,每個呼叫都可能涉及數據更改。 - >問題