2010-01-12 2 views
2

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

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

+0

"То, что я называю scrobbler". Почему это в вопросе? Я не вижу, как это помогает. –

+1

Я думаю, это не так, но это для полноты. –

+0

С тех пор, как вы сказали: «Я называю Scrobbler», и я чувствую себя смешно сегодня, я спрошу вот так: чувак, почему бы вам не запустить python manage.py syncdb? –

ответ

1

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

+0

Если база данных неверно сконфигурирована, то как все остальные тесты, основанные на одной таблице, проходят нормально? –

+0

Да. Сельдерей + некоторый MQ (или таблица базы данных). Отделите внимание здесь. Я думаю, что ОП пытается прикрепить круглое отверстие. – DrBloodmoney

1

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

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

0

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

2

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

Я бы порекомендовал что-то вроде celeryd вместо потоков, очереди сообщений намного проще работать, чем потоки.

+0

Будьте осторожны при публикации копий и вставных шаблонов/дословных ответов на несколько вопросов, они, как правило, помечены сообществом как «спам». – Kev

+0

Конечно ... но оба вопроса имели один и тот же ответ, и, если вы заметили, я дал два разных ответа. И, конечно, никто не поддержал эти правильные ответы, в том числе и себя. Сообщество непостоянно, если ничего другого :-) –

Смежные вопросы