У меня есть сценарий Python с несколькими потоками, связанными друг с другом очередями.Один из потоков имеет соединение MySQLdb, которое используется в функции инициализации потока, а также в основном цикле в основном цикле потока.
Теперь, когда скрипт выполняется, соединение MySQLdb работает просто отлично.в части инициализации потока.Но когда он используется в основном цикле потока, он полностью блокируется в строке self.cursor.execute(SQL)
.Теперь все становится еще страннее, когда я нажимаю Ctrl-C после тупика.Затем блокируется взаимоблокировка, и курсор MySQLdb получает свой результат, и поток продолжает нормально работать до тех пор, пока KeyboardInterupt не будет перехвачен.
Я использовал один и тот же код раньше много раз, но это первый раз, когда я использовал MySQLdbв этом.Я никогда не сталкивался с таким поведением раньше, и я в недоумении, пытаясь понять, что здесь происходит.Одно дело, если бы у меня было какое-то исключение, на которое можно сослаться, но его нет.Кроме того, я не очень понимаю, почему строка self.cursor.execute(SQL)
действительно возвращает правильное значение после того, как я нажму Ctrl-C.
Я не вправе показывать реальный код, но, поверьте мне, он полностьюпрямо без излишеств.Основной цикл потока - это просто цикл while с функцией get Queue с запросом MySQLdb сразу после.Кажется, это не проблема SQL, как я пытался выполнить с помощью самого простого запроса SELECT 'hello'
, и он все еще ведет к тому же поведению.
В чем может быть причина такого поведения?
FWIW, я использую Python 2.7, и я получаю то же поведение в OS X / Ubuntu 11.10.
РЕДАКТИРОВАТЬ: Я начинаю задумываться, вызвано ли это настройкой сервера MySQL.Я только что попытался использовать другую библиотеку Python MySQL (pymysql), и она дает такое же поведение.
EDIT2: Я только что перезапустил сервер MySQL с помощью медленных запросов журнала.Как ни странно, я вижу другие запросы, но запрос, который блокирует, не отображается.
EDIT3: [решено вроде] Я нашел этот рецепт, подробно описывающий, какчтобы увидеть, что за темы.После небольшой отладки стало очевидно, что виновником был импорт в модуль MySQLdb.Затем я просто закомментировал строки 83-95 в MySQLdb / cursors.py, и он неожиданно заработал.Я не думаю, что эти строки в любом случае так важны, так как они, кажется, лишь выдают некоторые предупреждения, и я уверен в качестве этих конкретных запросов, которые я выполняю.
Если кто-то действительно знает более надежный способ обойтиВопрос, который я хотел бы услышать, хотя.