2014-09-15 2 views
0

Перемещение на страницу test?x=a, определенную ниже.Cherrypy + sqlite3 + Peewee падает, когда два процесса выполняют один и тот же код одновременно

Переход к test?x=a, а затем быстро осуществлять навигацию по test?x=b, как циклы будут продолжать работать в течение нескольких секунд, но один из них будет в конечном итоге аварии с ошибкой peewee.OperationalError: cannot start a transaction within a transaction.

Это, очевидно, не настоящий мировой тест, это способ воспроизвести проблемы реального мира, которые возникают у меня время от времени.

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

db = peewee.SqliteDatabase('db', check_same_thread=False) 

class Test(peewee.Model): 
    field = peewee.CharField() 
    class Meta: 
     database = db 

Test.drop_table(True) 
Test.create_table(True) 

class MyApp: 
    @cherrypy.expose 
    def test(self, x): 
     for i in range(1000): 
      Test.create(field='%s %03d' % (x, i)) 
      time.sleep(0.1) 

Я уже задавала this question, но у меня не было примера, что бы воспроизвести проблему.

ответ

1

Вместо check_same_thread=False попробуйте использовать threadlocals=True.

+0

Спасибо. Документация рекомендует: http://peewee.readthedocs.org/en/2.0.2/peewee/cookbook.html#multi-threaded-applications – stenci