2012-11-02 30 views
2

我是新來的python,並試圖在這裏得到一些幫助。我已經編寫了一個通過套接字傳輸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

你不需要在循環中每次打開一個新的套接字。否則它應該工作,但它可能取決於操作系統。你使用哪個操作系統? – mata

+0

目前我在Windows 7中運行它 – appubaje

+0

哦,是的!謝謝你現在正在幫助我:D – appubaje

回答

1

首先,每次發送數據時創建一個新的套接字將產生相當大的開銷。反覆調度新任務也會增加很多開銷,從而進一步減慢程序的執行速度。打印命令可能會增加一些開銷,特別是如果輸出大量數據。

其他要考慮的事項包括所涉及的系統定時器的精度,與硬件交互,python是一種解釋型語言等,但它們都比較小,所以你可以忽略它。如果你想寫一些實時的關鍵,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和負載,而且在正常的操作系統上也不是那麼準確(想想上下文切換和我提到的較小延遲)。如果您確實需要μs精度,則您可能不得不切換到實時操作系統並使用較低級別的編程語言。 –