1

我正在編寫多線程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()上,因爲沒有人獲得鎖。

任何想法如何解決這個問題?如何調試呢?

謝謝

回答

0

好像我用的是同一個連接使用多個線程,其中由DOCS是不允許的。

提示:確保每個線程都有自己的連接對象。