我正在編寫多線程python應用程序。PyThread_acquire_lock - 獲取密鑰的問題
主線程創建5個工作線程的線程池。 主線程還創建一個監視器線程。
共計:6個線程+ 1個主線程= 7
的全部帖子與MySQL服務器(MySQLdb的 - > libmysqlclient_r)談論
在我的SQL包裝我添加了一個Threading.Lock到數據庫查詢功能。 此鎖是一個全局鎖,並且所有查詢數據庫的線程都使用它。
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()是由於睡眠(30))。 我不明白,爲什麼其餘的線程卡在sem_wait()上,因爲沒有人獲得鎖。
任何想法如何解決這個問題?如何調試呢?
謝謝