2010-01-12 3 views
2

내가 scrobbler라고 부르는 것을 만들려고합니다. 작업은 대기열에서 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를 : 같은 테이블에 따라 다른 모든 테스트를 훌륭하게 통과 .

+0

"내가 scrobbler라고 부르는 것". 왜 그런 질문이 있습니까? 나는 그것이 어떻게 도움이되는지 볼 수 없다. –

+1

나는 그것이 정말로 그렇지 않다고 생각한다. 그러나 완전을 위해 거기에있다. –

+0

당신이 말했듯이 : "나는 Scrobbler라고 부른다."그리고 나는 오늘 이런 식으로 물어볼 것이다. 재밌다. 너 왜 파이썬 manage.py syncdb를 실행하지? –

답변

1

스레드는 아니지만 작업 대기열을 호출합니다. 서버 프로세스, 하나 또는 여러 개의 scrobbler 프로세스 및 통신 할 수있는 대기열이 있습니다. 대기열은 데이터베이스에 있거나 Beanstalkd와 같은 별도의 항목 일 수 있습니다. 이 모든 것은 사용자의 오류와 관련이 없으며 데이터베이스가 잘못 구성된 것처럼 들립니다.

+0

데이터베이스가 잘못 구성된 경우 동일한 테이블을 기반으로하는 다른 모든 테스트가 어떻게 성공적으로 수행됩니까? –

+0

예. 셀러리 + 일부 MQ (또는 데이터베이스 테이블). 여기에서 우려를 분리하십시오. 나는 OP가 둥근 구멍에 못을 박 으려고한다고 생각해. – DrBloodmoney

1

1) SQLite가 아닌 실제 데이터베이스를 사용하면 오류가 지속됩니까?

2) 스레드를 사용하는 경우 스레드에서 사용할 개별 SQL 커서를 만들어야 할 수 있습니다.

0

나는 실제로 테이블이 존재하지 않는다고 생각한다. 이것은 처음에는 SQL commad 이나 다른 방법으로 만들어야한다고 생각한다. 내가 다른 모듈을 테스트하기위한 작은 데이터베이스가 있기 때문에 난 그냥 데이터베이스를 삭제하고 syncdb 명령을 사용하여 다시 작성하십시오.

2

장고의 메모리 데이터베이스 (이 경우 sqlite3)에서 스레딩을 사용할 수 없습니다. bug을 참조하십시오. 이것은 PostgreSQL 또는 MySQL에서 작동합니다.

스레드 대신 celeryd를 사용하는 것이 좋습니다. 메시지 대기열은 스레딩보다 작업하기가 훨씬 쉽습니다.

+0

여러 질문에 대해 상용구/축 어적 인 답변을 복사하여 붙여 넣을 때는 커뮤니티에서 "스팸성"으로 표시되는 경향이 있으므로주의하십시오. – Kev

+0

물론 ... 두 질문 모두 똑같은 대답을하고 있습니다. 실제로 두 가지 대답을했습니다. 그리고 물론, 아무도 자신을 포함하여 정답을 너무 높게 책정하지 않았습니다. 아무것도 아닌 경우 커뮤니티는 변덕 스럽습니다 :-) –