2010-07-06 5 views
4

누군가 내가 Twisted를 사용할 것을 제안했을 때 PyGTK에서 작동하는 비동기 활동을 얻는 데 어려움을 겪고있었습니다.Twisted/PyGTK의 네트워크가 아닌 단순한 예

저는 Twisted가 네트워킹 프레임 워크로 시작했음을 알고 있지만 다른 것들에도 사용할 수 있습니다. 그러나 내가 본 모든 예제에는 네트워크 기반 코드가 많이 포함되어 있습니다. 간단한 PyGTK 데스크톱 애플리케이션에 Twisted를 사용하는 예를보고 싶습니다. 사물의 네트워크 측면을 이해하는 데 더 많은 정신적 노력을 기울일 필요가 없습니다.

So : Twisted를 사용하여 GTK (PyGTK) 앱을 만들고 비동기 작업을 수행하는 방법에 대한 간단하고 간단한 튜토리얼이 있습니까?

은 (예, pbgtk2.py을 본 적이 그것은 초보자에, 주석 네트워크 중심 완전히 이해할 수 있습니다.).

업데이트 : 내가 glib.idle_add/gtk.gdk.lock와 다양한 불만을 나열했다과 친구에서 제대로 작동하지 Windows. 이것은 모두 pygtk list에서 추론되었습니다. Windows에서 작동하는 비동기 동작을 얻으려면 PyGTK에 필요한 몇 가지 트릭이 있습니다.

그러나 요점은 여전히 ​​PyGTK에서 비동기 활동을 언급 할 때마다 "스레드를 사용하지 말고 Twisted를 사용하십시오!"라고 말합니다. 왜, 어떻게하는지 알고 싶습니다.

+1

비동기 적으로 수행하려는 작업의 예를 들려 줄 수 있습니까? –

+2

뭐든지! 정말 큰 파일을 읽고 처리하고 있습니다. 응답이 수신 될 때까지 직렬 포트를 폴링합니다. '수입 시간; time.sleep (100); callback_func (결과)'. 나는 그 작업이 어떻게 관련이 있는지 모르겠다. 그러나 하나를 고르자. – detly

+1

나의 요지는 내가 원한 전부지만, 나는 네트워킹 물건을 해독하려고 애쓰다. – detly

답변

2

트위스트가 수행 할 수는 gobject.io_add_watch/glib.io_add_watchgobject.timeout_add/glib.timeout_add (플러스 일부 다른, 당신은 G 객체와 glib module에서 찾을 수) 단순히 uses functions 같은 pygtk에서 비동기 작업, 그래서 거기에 많은 차이가 날 pygtk 기능을 사용하여 아니에요 또는 트위스트 네트워킹이 필요하지 않은 경우.

추가 트위스트는 비동기 태스크를 사용하는 pygtk과 동일한 문제가 있습니다. 트위스트는 pygtk와 동일한 루프를 사용하므로 차단 태스크를 수행하면 차단됩니다.

가장 좋은 방법은 기본적으로 이러한 상황을 처리하기 위해 만들어진 glib functions 중 하나를 사용하는 것입니다.

나는 응용 프로그램에서 twisted + pygtk의 창에서 올바른 동작을 테스트했지만, 대용량 파일에서 최대 읽기, 기본적으로 청크 당 청크는 glib.idle_add 또는 glib.io_add_watch을 사용하여 꼬인 용도로 사용하는 것을 피했습니다 그와 비슷한 것).

예를 들어, glib.io_add_watch으로 stdout을 생성하고 처리하는 것이 작동하지 않는 것 같은데요. 나는 비동기 프로세스의 수행을 pygtk에서 처리하는 article on my blog을 작성했는데, 버전에 의존 할 수는 있지만 창에서 작동한다는 것은 확실하지 않습니다.

+0

원래 glib/pygtk의 여러 가지 주요 루프 도우미 함수에 대해 혼란 스러웠지만이 문제가 해결되었습니다. 내 질문의 나머지 부분은 여전히 ​​다소 있습니다. *이 문제를 해결하기 위해 내 질문을 업데이트했습니다. * – detly

+0

이러한 기능은 _ 유일한 _ 옵션이며 꼬아서는 다른 기능을 수행하지 않습니다! (pygtk와 함께 사용하는 경우) 그리고 창문에서 작동합니다. 마술은 없습니다. 코드는 http : // twistedmatrix입니다. 문제는 "블로킹"과 관련이 있으며, 비동기 프레임 워크와 완전히 관련되지 않은 트위스트입니다 (블로킹을 실행하면 문제가 발생합니다.)// trac/browser/tags/releases/twisted-9.0.0/twisted/internet/gtk2reactor.py 꼬인 코드, 그러나 그것은 pygtk와 같은 루프에서 runned입니다). 어쨌든 "트릭"을 사용해야합니다. – pygabriel

+0

비동기 활동을위한'glib' 함수를 사용하는 것만으로는 충분하지 않습니다. 파이썬'쓰레드 (threading) '툴 (heavy I/O 용)이나'멀티 프로세싱'(CPU 사용량이 많은)과 함께 사용해야합니다. 나는 그 함수들이 Twisted에서 사용되는 것을 이해하지만, Twisted가 스레드 차단에 대한 더 나은 API를 줄 수 있다는 인상을 받았다. ** 그러나 실제 GTK 예제가 없기 때문에 이것이 진실인지 알 수 없습니다! ** 그러므로, 질문입니다. 자, Twisted가 정말로 실질적인 혜택을 추가하지 않는다면, 그것은 유효한 대답이기도합니다. – detly

관련 문제