Python NetworkProgramming 프레임워크 (HTTP뿐아니라 주요한 IP들을 거의 다 IoMultiplexing으로 구현할 수 있다.)
http://twistedmatrix.com/products/twisted
이 프레임워크 안에 최근의 프로그램기법들이 녹아있다.
Prerequisites
최근, WebApplication templating 모듈로 쓰던 woven이 deprecated되고, Nevow가 사용된다.
관련자료
IbmDeveloperWorks기사 Network programming with the Twisted framework
PyZine기사 Getting Twisted - a Framework for writing Asynchronously Networked Applications
관련개발자 Blog커뮤니티 : http://planet.twistedmatrix.com/
관련포스트
http://openlook.org/blog/python/0405TwistedMsn.html by [Perky]
http://blog.vrplumber.com/358 SSL 바인딩 및 Nevow사용자인증 예제
궁금한것
Q.
관련 스크립트
외부프로세스를 비동기로 돌리기 --yong27, 2004-11-12
1 import os
2 from twisted.internet import reactor, utils
3
4 myjob = dict()
5
6 def doRepeatMasker(key, args):
7 d=utils.getProcessOutput('RepeatMasker',
8 args,
9 {'PATH':os.environ['PATH']+':'+'/home/estin/bin'})
10 def gotOutput(output):
11 print 'in call back...'
12 print output
13 myjob.pop(key)
14 print ' after poped', myjob
15 print 'end callback..'
16 print ' myjob status :', myjob
17 def gotError(failure):
18 print 'in errback...'
19 print failure
20 print 'end errback...'
21 d.addCallbacks(gotOutput, gotError)
22 return d
23
24 job1 = 'rp1', ['-cow', 'testseq']
25 job2 = 'rp2', ['-cow', 'testseq3']
26
27 print '--------------df1'
28 print ' myjob status :', myjob
29 df1 = doRepeatMasker(*job1)
30 myjob['rp1'] = df1
31 print ' myjob status :', myjob
32
33 print '--------------df2'
34 print ' myjob status :', myjob
35 df2 = doRepeatMasker(*job2)
36 myjob['rp2'] = df2
37 print ' myjob status :', myjob
38
39 reactor.run()
관련 팁 정리
의외로 유용한 문서가 없다. 홈페이지에 있는건 너무 개괄적. 직접적인 사용법을 이해하려면, 소스를 직접 봐야한다. 생각난김에 소스를 보며, 몰랐었던 사실들 정리. --yong27, 2004-10-12
- twisted.enterprise.adbapi의 dbpool은 DB 커넥션수를 항상 언제나 3~5개로 유지한다. 갯수는 수정가능.
- 함수값이 필요한 부분은 함수를 리턴한다. don't call us, we'll call you
- row 객체를 써먹는 방법은 두가지.
- db refector로부터 loadObjectsFrom(table명) 혹은,
- 빈객체를 만들고 refector.insertRow
- Deferred이해가 쉽지않다. 특히도, twisted내부 몇몇 함수들은 defer를 리턴하는데, 내가 필요한것은 값인데 뭔놈의 defer를 리턴하니,,, 좀 난감... 이를 이용하는 가장 간단한 방법은 다음과 같다. 특정 함수가 Deferred를 리턴하면, 값으로 기대되는 것을 인수로 받는 빈 함수를 만들고, 해당 defer에 addCallback 후, defer를 리턴한다. 혹은 nested function을 쓸수도 있다. 예제참고
- defer 에서 기대되는 값이 callback 되는 함수의 첫번째 인수로 사용된다는 사실은 중요하다. 만일 callback되는 함수가 인수를 받지 않도록 설계된다면 chain으로 연결되지 않고, async로 각각 따로 돌아간다.
rend.Page 를 상속받은 페이지객체에서, request를 가져오는 방법은 request = inevow.IRequest(context)
tags 의 속성에 class 를 넣고싶을 때, (즉, CSS를 적용하고 싶을 때) class 는 Python예약어라 syntax error. 이때 편법은
twisted.internet.utils 의 getProcessOutput 할때 주의사항. args에 WildCard가 사용될 수 없다. 정말이지 한참을 돌아돌아 알아낸 사실. 참고로 os.system()에서는 사용해도 이상없다.
euc-kr CharacterSet을 쓰고 싶으면, nevow/appserver.py 의 134라인의 setHeader부분을 euc-kr 로 수정
외부프로세스를 돌릴때, internet.utils.getProcessOutput 을 쓰게 되는데, 이 경우 stdin을 써먹을 수 없다. protocol.ProcessProtocol 을 상속받는 새로운 프로토콜을 만들고, reactor.spawnProcess 해야함.
기타
Twisted에서 deferred를 UnitTest하는 방법에 대해 질문하다.
몇몇 답변들이 있지만, 아직까지도 감이 안온다. -- yong27 2005-10-02 12:08:11