2012-11-02 32 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精度,则您可能不得不切换到实时操作系统并使用较低级别的编程语言。 –