2011-08-16 45 views
12

例如,如果我使用chain創建迭代器,我可以在多個線程上調用它嗎?請注意,依賴於GIL的線程安全性是可以接受的,但不是可取的。itertools線程安全嗎?

(請注意,這與this question有所不同,它處理的是生成器,而不是用C編寫的迭代器)。

回答

11

首先,official documentation on itertools中沒有任何內容表示它們是線程安全的。所以看起來,通過規範,Python並不保證任何有關的信息。這可能與Jython或PyPy等實現不同,但這意味着您的代碼可能不可移植。

其次,大多數itertools(除了簡單的,如count)以其他迭代器作爲它們的輸入。您需要這些迭代器以線程安全的方式正確運行。第三,一些迭代器在由不同線程同時使用時可能沒有意義。例如,在多線程中工作的izip可能會進入競爭狀態,從多個源獲取元素,特別是由等價的python代碼定義的(當一個線程將設法從一個輸入迭代器獲取值時會發生什麼,然後是來自其中兩個線程的第二個線程?)。

還要注意的是,文件沒有提到itertools是用C實現的,我們知道(作爲一個實現細節),其CPython中的itertools實際上是用C寫的,但在其他實現中,它們可以恰當地實現爲發電機,和你可以回到question you cited

所以,不,你不能假設它們是線程安全的,除非你知道你的目標python平臺的實現細節。