ошибка при использовании многопоточности и mysqldb

ошибка при получении доступа к данным многопоточной программы.

Exception in thread Thread-2:

ProgrammingError: (2014, "Commands out of sync; you can't run this command now")

Exception in thread Thread-3:

ProgrammingError: execute() first

Ответы на вопрос(3)

Вероятно, вы получаете доступ к базе данных из нескольких потоков без блокировки. Плохо.

Вы должны держать замок наthreading.Lock() или жеthreading.RLock() при доступе к вашей БД. Это предотвращает вмешательство нескольких потоков в действия других потоков.

 Ganesh Ghalame07 февр. 2012 г., 12:05
Но потом, если я не разделяю объекты и не использую синглтон, это выдает ошибку ProgrammingError: (2014, «Команды не синхронизированы; вы не можете запустить эту команду сейчас»)

http://dev.mysql.com/doc/refman/5.0/en/commands-out-of-sync.html.

Руководство Mysqldb предлагает следующее:

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

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

Посмотреть дополнительную информацию поиск по ключевым словамMySQLdb руководство,

 Ganesh Ghalame07 февр. 2012 г., 14:07
Большое спасибо, это работает для меня

ОПТОСОЗ 249модули доступа к данным имеют постоянную уровня модуляthreadsafety:

Целочисленная константа, указывающая уровень безопасности потоков, поддерживаемый интерфейсом. Возможные значения:

0 Темы не могут делиться модулем.
1 Темы могут совместно использовать модуль, но не соединения.
2 темы могут совместно использовать модуль и соединения.
3 темы могут совместно использовать модуль, соединения и курсоры.

Совместное использование в вышеупомянутом контексте означает, что два потока могут использовать ресурс, не оборачивая его, используя семафор мьютекса для реализации блокировки ресурса. Обратите внимание, что вы не всегда можете сделать потоки внешних ресурсов безопасными, управляя доступом с помощью мьютекса: ресурс может полагаться на глобальные переменные или другие внешние источники, которые находятся вне вашего контроля.

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

Протокол MySQL не может обрабатывать несколько потоков, используя одно и то же соединение одновременно. Некоторые более ранние версии MySQLdb использовали блокировку для обеспечения безопасности потока 2. Хотя это не очень сложно сделать с помощью стандартного класса Cursor (который использует mysql_store_result ()), он усложняется SSCursor (который использует mysql_use_result (); с последним Вы должны убедиться, что все строки были прочитаны, прежде чем можно будет выполнить другой запрос. Это дополнительно усложняется добавлением транзакций, поскольку транзакции начинаются, когда курсор выполняет запрос, но заканчиваются, когда COMMIT или ROLLBACK выполняются объектом Connection. потоки просто не могут совместно использовать соединение во время выполнения транзакции, в дополнение к невозможности поделиться им во время выполнения запроса, что чрезмерно усложняет код до такой степени, что оно просто не стоит.

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

 Janne Karila07 февр. 2012 г., 12:59
@GaneshGhalame Вам нужно несколько объектов подключения, а не один.
 Ganesh Ghalame07 февр. 2012 г., 12:03
Но потом, если я не разделяю объекты и не использую синглтон, тогда выдается ошибка ProgrammingError: (2014, «Команды не синхронизированы; вы не можете запустить эту команду сейчас»)

Ваш ответ на вопрос