2012-11-02 3 views
2

저는 파이썬을 처음 사용하고 여기에서 도움을 얻으려고합니다. 소켓을 통해 UDP 데이터를 전송하는 코드를 작성했습니다. 루프마다 50 마이크로 초마다 데이터를 다시 전송하고 싶었지만 매 3 초마다 보낼 수 있습니다! 나는 틀린 일을하고 있다고 확신한다. 나를 도울 수 있니? 아래 코드를 붙여 넣었습니다.UDP 서버 프레임 갭

import socket,codecs,binascii,re ,sched, time 

UDP_IP = "XXX.XXX.XXX.XXX" 

UDP_PORT = 30001 
MESSAGE = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\ 
x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20'# !"#$%' #"\x00\x01\x02 " 


s = sched.scheduler(time.time, time.sleep)  

def send_data(sc): 

    sock = socket.socket(socket.AF_INET, # Internet 

        socket.SOCK_DGRAM) # UDP 

    sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) 



    print"" 
    print"" 
    print"" 
    print"" 
    print""  
    sc.enter(0.000050, 1, send_data, (sc,)) 
    print time.time() 
    print"" 
    print"" 

s.enter(0.0000050, 1, send_data, (s,))  
s.run()  
+2

루프 내에서 매번 새 소켓을 열 필요가 없습니다. 그렇지 않으면 작동하지만 OS에 따라 다를 수 있습니다. 어느 OS를 사용합니까? – mata

+0

현재 Windows 7에서 실행 중입니다. – appubaje

+0

오 맞아! 덕분에 이제는 나를 도와주는 마타 : – appubaje

답변

1

우선 데이터를 보낼 때마다 새로운 소켓을 만들면 약간의 오버 헤드가 발생합니다. 반복적으로 새로운 작업을 예약하면 많은 오버 헤드가 추가되어 프로그램이 더욱 느려지 게됩니다. 인쇄 명령은 특히 많은 양의 데이터를 출력하는 경우 약간의 오버 헤드를 추가 할 수 있습니다.

다른 고려해야 할 사항은 관련된 시스템 타이머의 정밀도, 하드웨어와의 상호 작용, 파이썬이 해석 된 언어 등입니다. 그러나 비교에서 모두 중요하지 않으므로이를 무시할 수 있습니다. 실시간으로 중요한 것을 작성하고 싶다면 C가 더 나은 선택이 될 것입니다. 당신이 당신의 주요 프로그램을 차단하지 않으려면 스레드에 그것을 넣을 수 있습니다

import socket, time 
# ... 
def send_data(): 
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
    while True: #TODO: would require an abort condition 
     sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) 
     time.sleep(0.00005) # don't count on this to be 100% accurate 

:

어쨌든, 난 부분을 소비하는 시간을 없애 것이다 프로그램을 속도를

from threading import Thread 
t = Thread(target=send_data) 
t.start() 
+0

예 소켓을 만들 때마다 내 문제가 있었지만 그 문제는 해결되었지만 여전히 일정에 만족하지는 않습니다. 정확하지 않은 이유는 새로운 케이스를 열어 놓을 수도 있습니다. – appubaje

+0

'time.sleep' 정확성은 호출하는 시스템 호출의 정확도에 따라 달라집니다. 단지 더 빨리 가고 싶다면, 그것을 제거하거나 바쁜 대기를 시도 할 수 있습니다. 그러나 그것은 CPU와 부하에 종속적 일뿐만 아니라 (컨텍스트 스위칭과 내가 언급 한 사소한 대기 시간을 생각할 수도 있습니다) 정규 OS에서는 정확하지 않습니다. 진정으로 μs 정확도가 필요하다면 실시간 운영 체제로 전환하고 더 낮은 수준의 프로그래밍 언어를 사용해야 할 수도 있습니다. –