2012-05-23 12 views
0

Я пишу многопоточное приложение python, которое читает/записывает в БД MySQL (используя MySQLDB и libmysqlclient_r - потокобезопасную библиотеку).MySQLdb - libmysqlclient_r stuck on read()

В какой-то момент (не уверен, почему и когда) одна из нитей застревает.

#0 0x00007f6c124ad14d in read() from /lib/libpthread.so.0 
#1 0x00007f6c0d78f759 in vio_read_buff() from /usr/lib/libmysqlclient_r.so.16 
#2 0x00007f6c0d79086f in ??() from /usr/lib/libmysqlclient_r.so.16 
#3 0x00007f6c0d790c75 in my_net_read() from /usr/lib/libmysqlclient_r.so.16 
#4 0x00007f6c0d78afca in cli_safe_read() from /usr/lib/libmysqlclient_r.so.16 
#5 0x00007f6c0d78b7a9 in ??() from /usr/lib/libmysqlclient_r.so.16 
#6 0x00007f6c0d789adc in mysql_real_query() from /usr/lib/libmysqlclient_r.so.16 
#7 0x00007f6c0db24aad in ??() from /usr/lib/pymodules/python2.6/_mysql.so 
#8 0x00000000004a7ba5 in PyEval_EvalFrameEx() 
#9 0x00000000004a84a0 in PyEval_EvalFrameEx() 

Любая идея, почему read() не возвращается? Это случается раз в то время.

Примечание! Существует около 6 различных потоков, которые подключаются к этой БД и выполняют запрос/выполнение на нем.

Это может быть плохая строка запроса? Плохое использование API?

ответ

0

Если вы используете одно соединение между потоками, это проблема. Клиентская библиотека/протокол MySQL не позволяет этого. Вы можете смело дать каждому потоку свое собственное соединение, и они не будут блокировать друг друга.