簡體   English   中英

PyThread_acquire_lock-獲取密鑰的問題

[英]PyThread_acquire_lock - issues with Acquiring a Key

我正在編寫多線程python應用程序。

主線程創建一個由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()是由於sleep(30)造成的)。 我不明白,為什么其余線程都停留在sem_wait()上,因為沒有人獲得該鎖。

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

謝謝

似乎我正在使用具有多個線程的同一連接,DOCS不允許這樣做。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM