Python NetworkProgramming 프레임워크 (HTTP뿐아니라 주요한 IP들을 거의 다 IoMultiplexing으로 구현할 수 있다.)

http://twistedmatrix.com/products/twisted

이 프레임워크 안에 최근의 프로그램기법들이 녹아있다.

Prerequisites

최근, WebApplication templating 모듈로 쓰던 woven이 deprecated되고, 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을 쓸수도 있다. 예제참고
       1 def someFunction():
       2     d = getDeferredFromSomeWhere()
       3     d.addCallback(gotValue)
       4     return d
       5 
       6 def gotValue(myExpect):
       7     return myExpect
       8 
       9 
      10 def someFunction2():
      11     d = getDeferredFromSomeWhere()
      12     def gotValue(myExpect):
      13         return myExpect
      14     d.addCallback(gotValue)
      15     return d
    
  • defer 에서 기대되는 값이 callback 되는 함수의 첫번째 인수로 사용된다는 사실은 중요하다. 만일 callback되는 함수가 인수를 받지 않도록 설계된다면 chain으로 연결되지 않고, async로 각각 따로 돌아간다.
  • rend.Page 를 상속받은 페이지객체에서, request를 가져오는 방법은 request = inevow.IRequest(context)

  • tags 의 속성에 class 를 넣고싶을 때, (즉, CSS를 적용하고 싶을 때) class 는 Python예약어라 syntax error. 이때 편법은

       1 from nevow import tags as t
       2 newTable = t.table(**{'class':'mytable01'})
    
  • 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


CategoryProgramLibrary

Twisted (last edited 2011-08-21 16:19:42 by 211)

web biohackers.net