2012-03-28 1 views
2

私は、Pythonの組込み型は一般にスレッドセーフではないことを知っていますが、thisは、競合する2つのスレッドからpop()を呼び出すことは安全だと主張しています。もちろん、例外が発生する可能性がありますが、データは破損していません。この主張を検証する文書を見つけることができないようです。本当ですか?ドキュメンテーション、してください!Pythonでは、set.pop()はthreadsafeですか?

+0

Pythonのソースコードを見ると、 'set'オブジェクトはいくつかの便利なメソッドを持つ単なる辞書です。 – Blender

+0

私はあなたが指摘しているものの下でexaclyです[あなたが探している答え](http://stackoverflow.com/a/2227210/1132524)と思います。コメントを読み、[GIL](http://wiki.python.org/moin/GlobalInterpreterLock)が何であるかを確認してください。 –

+0

あなたがリンクしている同じ質問は、変更可能な型はスレッドセーフではないことを示しています:http://stackoverflow.com/a/2227220/104847競合状態がないようにロック機構を実装する必要があります。 – Ale

答えて

8

set.pop method in the CPython sourceを見ると、GILがリリースされないことがわかります。

これは、CPythonプロセス内で一度に1つしか発生しないことを意味します。つまり、set.popは1度に発生します。

set.pop checks if the set is empty以降、空のセットからポップしようとすると、IndexError以外は何も起こりません。

いいえ、CPythonを使用して複数のスレッドのセットからデータを破棄することはできません。

+0

すぐに問題が解決するので、この回答を受け入れてください。 fffuuuutttuuuurreeからの読者への注意:@Niklas(上記)からのコメントに注意してください。 –

0

2つのスレッドが同じ値をポップできないという意味で、アトミックであるために「ポップ」操作がスレッドセーフであると考えています。

たとえば、別のスレッドがそのコレクションを反復していると、その動作に依存しません。

いずれの具体的なドキュメントも見つかりませんでしたが、この方向を指すトピックがいくつかあります。 Pythonの公式文書は実際にこの種の情報に役立ちます。

+0

私の答えのソースリンクを確認してください。 CPythonでは、 'set.next'と' set.pop'の両方を同時に実行することはできません。最悪の場合は、シーケンス内の項目を 'it 'loop - アイテムをスキップします。 – agf

関連する問題