1

私はマルチスレッドのPythonアプリケーションを書いています。

メインスレッドは、5つのワーカースレッドのスレッドプールを作成します。メインスレッドは、モニタースレッドも作成します。

合計:6スレッド+1メインスレッド=7

すべてのスレッドはMySQLサーバーと通信します(mysqldb-> libmysqlclient_r)

私のSQLラッパーでは、DBクエリ関数にThreading.Lockを追加しました。このロックはグローバルロックであり、DBを照会するすべてのスレッドがそれを使用します。

def query(self, query):
  with lock:
   execute Query Here

ある時点でメインスレッドがスタックするまで(すべてのスレッドも同様に)、すべてが正常に機能します。GDBデバッガーを接続すると、次のことに気付きました。(情報スレッド)

  7 Thread 0x7f555c386700 (LWP 16077)  0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0
  6 Thread 0x7f555bb85700 (LWP 16078)  0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0
  5 Thread 0x7f555b384700 (LWP 16079)  0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0
  4 Thread 0x7f555ab83700 (LWP 16080)  0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0
  3 Thread 0x7f555a382700 (LWP 16081)  0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0
  2 Thread 0x7f5559b81700 (LWP 16083)  0x00007f55609141a3 in select () from /lib/libc.so.6
  1 Thread 0x7f5561e6f700 (LWP 16061)  0x00007f5561a503c0 in sem_wait () from /lib/libpthread.so.0

Th1 =メインスレッド、Th2 =モニタースレッド、Th3-Th7-ワーカースレッド

モニタースレッドの横にあるすべてのスレッドがsem_wait()を待機していることに気付きました。

(gdb) bt
#0  0x00007f5561a503c0 in **sem_wait** () from /lib/libpthread.so.0
#1  0x00000000004d44e8 in **PyThread_acquire_lock** ()
#2  0x00000000004d8982 in ?? ()
#3  0x00000000004a7ba5 in PyEval_EvalFrameEx ()

ただし、モニタースレッドはロックを取得および解放できます(30秒ごとに実行され、表示されるselect()はsleep(30)によるものです)。誰もロックを取得していないので、なぜ残りのスレッドがsem_wait()でスタックしているのかわかりません。

これを解決する方法はありますか?これをデバッグする方法は?

ありがとうございました

4

1 に答える 1

0

複数のスレッドを使用して同じ接続を使用していたようですが、DOCSでは許可されていません。

ヒント:各スレッドに独自のConnectionオブジェクトがあることを確認してください。

于 2012-06-14T16:38:55.543 に答える