接続オブジェクトが異なるスレッドで使用されている場合、cx_Oracle カーソルはどのように動作しますか? ジェネレーターはこの動作にどのように影響しますか? 具体的には...
編集:元のサンプル関数は正しくありませんでした。サブ関数によってジェネレーターが返されましたyield
が、ループ内で直接使用されていませんでした。finally
これにより、いつ実行されるか(実行後) が明確にreturn
なりますが、別のスレッドがカーソルの作成元の接続オブジェクトの使用を開始した場合にカーソルを使用できるかどうかはまだわかりません。実際には (少なくとも python 2.4 では)、構文エラーが発生するようですtry...finally
。yield
def Get()
conn = pool.get()
try:
cursor = conn.cursor()
cursor.execute("select * from table ...")
return IterRows(cursor)
finally:
pool.put(conn)
def IterRows(cursor):
for r in cursor:
yield r
Get()
複数のスレッドから呼び出される関数です。接続はthreaded=False
引数で作成されます。
不思議なんだけど...
- スレッド 2 が現れて同じ接続オブジェクトを使用する場合、スレッド 1 の
cursor
オブジェクトは引き続き使用できますか? そうでない場合、何が起こる可能性がありますか?
私が見ている動作は、プロトコル エラーについて話している cx_Oracle の例外であり、その後に segfault が続きます。