2010-05-10 3 views
0

Django ORM을 사용하는 데몬으로 비동기 데이터 처리를 수행하는 방법을 찾고 있습니다. 그러나 ORM은 스레드로부터 안전하지 않습니다. 스레드 내에서 django 객체를 검색/수정하려고하면 스레드로부터 안전하지 않습니다. 그래서 비동기를 달성하는 올바른 방법은 무엇입니까 궁금하네요?비동기 데몬 처리/Django와의 ORM 상호 작용

기본적으로 DB에서 사용자 목록을 가져 와서 타사 API를 쿼리 한 다음 해당 사용자의 사용자 프로필 행을 업데이트합니다. 데몬이나 백그라운드 프로세스. 사용자 당 일련의 작업을 수행하는 것은 쉽지만 모든 작업을 수행하는 데 너무 오래 걸립니다. 데몬이 ORM을 통해 사용자를 검색하고 업데이트하는 경우 한 번에 10-20 명의 사용자를 처리하는 방법은 무엇입니까? 나는이에 대한 표준 스레딩/큐 시스템을 사용하지만 같은 상호 작용을 스레드 수

models.User.objects.get(id=foo) ...

장고 자체가 각 요청에 대해 ORM 비동기 호출 (?)하게 비동기 처리 시스템, 그래서 거기에해야 그것을하는 방법 있으십시오? 지금까지 문서에서 아무 것도 발견하지 못했습니다.

건배

비동기 처리가 자체 프로세스에서 수행되는 경우

답변

2

, 다음 스레드가 주소 공간을 공유하지 않기 때문에 안전성이 문제가되지 않는 스레드, 그래서 그들은 서로 간섭 할 수 없다. 그들은 각각 모델 객체의 사본을 가지고 있습니다. 동시성은 트랜잭션이있는 데이터베이스에 의해 제어됩니다. 너 괜찮아.

비동기 비즈니스를 수행하기 위해 웹 서버 프로세스 중 하나에 스레드를 생성하려면 스레드로부터 안전하지 않은 모든 API 호출을 잠글 필요가 있습니다.

from threading import Lock 

아파치는 conncurrent 웹 요청을 처리하기 위해 fork() 시스템 호출을 통해 여러 프로세스를 사용합니다. 이것이 Django의 ORM API가 쓰레드에 안전 할 필요가없는 이유입니다. 나는 아파치가 프로세스 대신 스레드를 사용할 수 있다고 생각하지만, 장고를 사용하기 위해서는 그 기능을 사용하지 말아야한다고 생각한다.

http://groups.google.com/group/django-developers/browse_thread/thread/905f79e350525c95

, BTW 당신이 스레드와 프로세스의 차이를 이해합니까? 그 종류의 중요한.

3

celery을 살펴보십시오. 나는 그것이 당신의 문제를 해결할 것이라고 생각합니다. 다중 처리 모듈을 사용합니다. 그것은 (아주) 작은 설정이 필요하지만 스케일링에 많은 도움이됩니다.