2011-01-16 2 views
9

저는 asyncore에 익숙하지 않으며 비틀어 진 자습서에 대한 몇 가지 소개를 제외하고는 비동기 프로그래밍 지식이 매우 제한적입니다.asyncore 콜백 스레드 시작 중 ... 할 수 있습니까?

나는 스레드에 가장 익숙하며 모든 응용 프로그램에서 사용합니다. 하나의 특정 응용 프로그램은 인터페이스로 couchdb 데이터베이스를 사용합니다. 이것은 변경 및 업데이트를 찾는 db의 longpolling을 포함합니다. couchdb에 사용하는 모듈은 couchdbkit입니다. asyncore 루프를 사용하여 이러한 변경 사항을보고 콜백으로 보냅니다.

그래서이 콜백은 내 작업자 스레드를 시작하는 지점입니다. 비동기식 프로그래밍과 스레드 프로그래밍을 혼합하는 것은 약간 미숙 한 것처럼 보입니다. 나는 couchdbkit을 정말 좋아하지만 내 프로그램에 문제를 소개하지는 않을 것입니다.

그래서, 내 질문은 비동기 콜백에서 스레드를 시작하는 것이 안전할까요? 여기

는 ... 일부 코드의

def dispatch(change): 
    global jobs, db_url # jobs is my queue 
    db = Database(db_url) 
    work_order = db.get(change['id']) # change is an id to the document that changed. 
            # i need to get the actual document (workorder) 

    worker = Worker(work_order, db) # fire the thread 
    jobs.append(worker) 
    worker.start() 
    return 


main() 
. 
. 
. 

consumer.wait(cb=dispatch, since=update_seq, timeout=10000) #wait constains the asyncloop. 

업데이트 :

이상이 찾고 후, 나는 couchdbkit 지도자에 대한 추가 질문이 있습니다. 잠재적으로 데이터베이스를 사용하는 수백 개의 스레드가 있습니다. 내 코드 샘플에서 볼 수 있듯이 스레드 당 couchdbkit.Database 객체를 인스턴스화합니다. 나는 이것이 낭비일지도 모른다라고 생각한다. 그렇다면 단일 데이터베이스 객체가 스레드간에 전역으로 사용되는 것이 좋습니까?

답변

3

서버가 새 문서를 반환 할 때마다 새 스레드가 생성되지 않습니까? 나는 당신이 최선을 다하는 것 같아요 전에 전에 서버에서 아무것도 호출하고 스레드가 dispatch 메서드에서 그들의 작업을 읽고 큐에 작업을 추가하십시오.

그러나 스레딩과 비동기 프로그래밍을 혼합하는 것이 위험하다고 생각할 이유는 없습니다.

+0

작업 순서에 따라 새 스레드를 만드는 것이 좋습니다. 각 작업자는 터널을 열고 원격 장치에서 다양한 유지 관리 작업을 수행합니다. 스레드 풀을 고려하지 않았지만 콜백을 사용하는 방법을 생각하면 좋은 아이디어 일 수 있습니다. 입력 해 주셔서 감사합니다. – sbartell