2016-02-28 48 views
0

我一直在做一些閱讀,找不到我在Python 2.7問題的最佳實踐,它是這樣說:添加項目列表使用線程在Python 2.7

我有一個列表的項目,我想遍歷所有這些,並調用一些函數。此功能將對這些項目執行一些操作,並返回一個新項目。 函數的每個返回值都將被附加到一個新的項目列表中。 一切都很好,很簡單,直到我嘗試使用線程來做到這一點。

我想做同樣的工作,但現在每個函數調用都會打開一個新的線程(最多20個線程),它將完成函數的工作並返回需要的信息返回到列表中。

newList = [] 

for item in myList: 
    info = getInfo(item) 
    newList.append(info) 

return newList 

從我讀,列表是線程安全的,所以我想也許使用隊列和線程模塊,然後把當前所有物品放入隊列,做這項工作的每個而經過newList和內部的每一個附加線程... 任何想法?

+0

你可以讓你的函數自己完成任務。將它傳遞給項目,列表和索引。然後函數可以計算出該物品該做什麼,一旦它確定,它就可以將該列表設置爲具有正確的物品。 – zondo

回答

1

假設操作不是線程安全的,除非你毫無疑問知道它們是非常明智的。

確保任何操作的原子性的最簡單方法是在執行操作之前獲取鎖,並且只有在執行操作時才釋放它。現在with聲明使得這非常簡單,因爲鎖對象是上下文管理器。

假設你的列表是全局模塊my_list那麼這很容易完成,如下所示。

my_lock = threading.Lock() 
my_list = [] 
    : 
    : 
    : 
def my_list_append(o): 
    with my_lock: 
     my_list.append(o) 

還要注意的是同一個鎖必須用於該列表的任何其它修飾(如彈出的項目關閉它,例如)。通過在其他線索中進行索引來簡單訪問元素應該不成問題。

另一種可能的方法是讓線程執行操作並通過作爲參數傳遞給線程的Queue.queue對象將項目附加到列表中。這假定只有該線程將任何東西附加到列表中。由於鎖定解決方案非常簡單,除非必須,否則我不會考慮這一點。