Потоки в приложении Django - PullRequest
2 голосов
/ 12 января 2010

Я пытаюсь создать то, что я называю скробблером.Задача состоит в том, чтобы прочитать пользователя Delicious из очереди, получить все его закладки и поместить их в очередь закладок.Затем что-то должно пройти через эту очередь, выполнить некоторый анализ и затем сохранить данные в базе данных.

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

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

Вот соответствующий код:

# relevant model #
class Bookmark(models.Model):
 account = models.ForeignKey( Delicious )
 url = models.CharField( max_length=4096 )
 tags = models.TextField()
 hash = models.CharField( max_length=32 )
 meta = models.CharField( max_length=32 )

# bookmark queue reading #
def scrobble_bookmark(account):
 try:
  bookmark = Bookmark.objects.all()[0]
 except Bookmark.DoesNotExist:
  return False

 bookmark.delete()

 tags = bookmark.tags.split(' ')
 user = bookmark.account.user

 for concept in Concepts.extract( bookmark.url ):
  for tag in tags:
   Concepts.relate( user, concept['name'], tag )

 return True

def scrobble_bookmarks(account):
 semaphore = Semaphore(10)
 for i in xrange(Bookmark.objects.count()):
  thread = Bookmark_scrobble(account, semaphore)
  thread.start()

class Bookmark_scrobble(Thread):
 def __init__(self, account, semaphore):
  Thread.__init__(self)
  self.account = account
  self.semaphore = semaphore

 def run(self):
  self.semaphore.acquire()
  try:
   scrobble_bookmark(self.account)
  finally:
   self.semaphore.release()

Это ошибка, которую я получаю:

Exception in thread Thread-65:
Traceback (most recent call last):
  File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
    self.run()
  File     "/home/swizec/Documents/trees/bookmarklet_server/../bookmarklet_server/Scrobbler/Scrobbler.py", line 60, in run
    scrobble_bookmark(self.account)
  File     "/home/swizec/Documents/trees/bookmarklet_server/../bookmarklet_server/Scrobbler/Scrobbler.py", line 28, in scrobble_bookmark
    bookmark = Bookmark.objects.all()[0]
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 152, in __getitem__
    return list(qs)[0]
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 76, in __len__
self._result_cache.extend(list(self._iter))
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 231, in iterator
    for row in self.query.results_iter():
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 281, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 2373, in execute_sql
cursor.execute(sql, params)
  File "/usr/local/lib/python2.6/dist-packages/django/db/backends/sqlite3/base.py", line 193, in execute
    return Database.Cursor.execute(self, query, params)
OperationalError: no such table: Scrobbler_bookmark

PS: все другие тесты в зависимости оттот же проход стола с летающими цветами.

Ответы [ 4 ]

2 голосов
/ 14 июля 2011

Вы не можете использовать многопоточность в базах данных памяти (в данном случае sqlite3) в Django, смотрите эту ошибку Это может работать с PostgreSQL или MySQL.

Я бы рекомендовал что-то вроде celeryd вместо потоков, с очередями сообщений НАМНОГО проще работать, чем с потоками.

1 голос
/ 13 января 2010

1) Ошибка сохраняется, если вы используете реальную базу данных, а не SQLite?

2) Если вы используете потоки, вам может потребоваться создать отдельные курсоры SQL для использования в потоках.

1 голос
/ 13 января 2010

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

0 голосов
/ 29 декабря 2010

я думаю, что таблица действительно не существует, т. Е. Сначала нужно создать ее с помощью SQL или любым другим способом. Поскольку у меня есть небольшая база данных для тестирования различных модулей, я просто удаляю базы данных и воссоздать ее с помощью команды syncdb

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