Как я могу решить это странное поведение блокировки MySQL в потоке Python? - PullRequest
1 голос
/ 28 марта 2012

У меня есть сценарий 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, и он неожиданно заработал.Я не думаю, что эти строки в любом случае так важны, так как они, кажется, лишь выдают некоторые предупреждения, и я уверен в качестве этих конкретных запросов, которые я выполняю.

Если кто-то действительно знает более надежный способ обойтиВопрос, который я хотел бы услышать, хотя.

1 Ответ

1 голос
/ 28 марта 2012

Может быть, вы разделяете связь между потоками. MySQLdb документы рекомендует

Не делить связи между потоки. Это действительно не стоит ваших усилий или моих, и, в конце концов, вероятно, снизит производительность, так как сервер MySQL работает отдельно нить для каждого соединения. Вы, конечно, можете делать такие вещи, как кэш соединения в пуле, и дать эти соединения одному потоку на время. Если вы позволите двум потокам использовать соединение одновременно, Клиентская библиотека MySQL, вероятно, выскочит и умрет. Вы были предупредил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...