2012-12-12 3 views
0

약간의 멀티 프로토콜 이미지 스트리밍 서버 (Python으로)를 프로그래밍하고 있으며 모든 프로토콜이 정상적으로 작동합니다. 단, 멀티 캐스트 프로토콜을 사용하면 CPU 사용량이 최대 150 % !파이썬에서 멀티 캐스트를 사용할 때 CPU 사용량이 높음

여기에 멀티 캐스트 코드입니다 :

 delay = 1./self.flux.ips 
    imgid = 0 
    lastSent = 0 

    while self.connected: 

     #self.printLog("Getting ready to fragment {}".format(imgid)) 
     fragments = fragmentImage(self.flux.imageFiles[imgid], self.fragmentSize) 
     #self.printLog("Fragmented {} ! ".format(imgid)) 

     # Checking if the delay has passed, to respected the framerate 
     while (time.time() - lastSent) < delay: 
      pass 

     # Sending the fragments 
     for fragmentid in range(len(fragments)): 
      formatedFragment = formatFragment(fragments[fragmentid], fragmentid*self.fragmentSize, len(self.flux.imageFiles[imgid]), imgid) 
      self.sendto(formatedFragment, (self.groupAddress, self.groupPort)) 

     lastSent = time.time() 

     imgid = (imgid + 1) % len(self.flux.images) 

UDP 프로토콜은 또한 조각으로 이미지를 전송하고, 나는 어떤 CPU 사용 문제가 발생하지 않습니다. 클라이언트는 또한 이미지를 가져 오는 데 약간의 대기 시간이 있음에 유의하십시오.

+0

어떻게 CPU를 150 %까지 늘리나요? 그럴 가능성은 희박합니다. –

+0

서버가 멀티 스레드이고'top' 프로그램이 프로그램 당 CPU 사용량을 보여줄 때 150 % CPU가 그럴듯합니다. – user4815162342

답변

2

(무거운) 대기 중 대기 대신에 time.sleep(delay)을 사용하면 좋을 것입니다 (이 질문은 Python: Pass or Sleep for long running processes? 참조).

더 나은 성능을 위해 PyUV, gevent, tornado 또는 twisted과 같은 I/O 이벤트 반응기를 고려해야합니다.

+0

감사합니다. 나는 무한 루프의 CPU 사용량에 대해 걱정하고 있었지만''통과 ''하지만 아무것도하지 않고 "그냥 괜찮습니다"라고 말했습니다. 글쎄, 그렇지 않았어! 참고 : time.sleep (지연) 대신, 다음을 수행했습니다. "time.sleep (지연 - (time.time() - lastSent))''(이 값이 양수이면) 지연 시간과 경과 시간 사이에는 조각화와 전송에 많은 시간이 소요될 수 있습니다. – halflings

관련 문제