2011-01-14 7 views
1

일부 asyncore.dispatcher 인스턴스를 GLib의 default main context에 통합하려고합니다.파이썬에서 glib.Source를 만드는 방법은 무엇입니까?

그림 asyncore.socket_map에 다양한 소켓에서 이벤트 준비를 감지 할 수있는 custom GSource을 만들 수 있습니다. C에서 나는 이것들이 필요한 GSourceFuncs을 생성함으로써 이루어 졌다고 믿습니다.이 호출은 싸고 비 차단 호출을 선택하여 asyncore.read, .write 및 friends를 사용하여 처리하도록 할 수 있습니다.

실제로 파이썬에서 GSource를 어떻게 만듭니 까? glib.Source 클래스는 undocumented이고 클래스를 대화식으로 사용하려는 시도는 헛된 것입니다.

asyncore 모듈에서 소켓 이벤트를 처리 할 수있는 다른 방법이 있습니까? (잠재적 처리량 및 CPU 사용을 위험에 빠뜨리는)

답변

0

입심 루프와 디스패처를 통합하는 쉬운 방법을 아래에 매우 단순화 된 표시됩니다 :

from asyncore import dispatcher, loop 
from glib import MainLoop, idle_add 

def loop_one(): 
    loop(timeout=0, count=1) 
    return True 

idle_add(loop_one) 
+0

내 질문에 : _ 시간 초과 (또는 잠재적 인 처리량 및 CPU 사용을 위험에 빠뜨리는)에 의존하지 않음. 답변을 삭제할 수 있습니다. –

+1

시간 초과가 0이므로 실제로 시간 초과를 사용하지 않으므로 함수는 직접 데이터를 처리하는 즉시 (실제로 데이터를 처리하는 즉시, io에서는 대기하지 않을 것입니다) 어디서나 데이터를 읽을 지 여부를 결정합니다. –

+0

이 함수는 기본 메인 루프에 보류중인 더 높은 우선 순위 이벤트가 없을 때마다 호출됩니다. 그렇다면 아무 이유없이 CPU를 빨아들입니다. 이벤트를 실제로 사용할 수 없다면 이벤트 루프를 사용할 필요가 없습니다! –

관련 문제