2

我是 python 新手,并试图在这里获得一些帮助。我编写了一个代码来通过套接字传输 UDP 数据。我想每 50 微秒循环重新传输一次数据,但我只能每 3 秒发送一次!我确定我做错了什么,你能帮帮我吗?我已经粘贴了下面的代码:

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()    
4

1 回答 1

1

首先,每次发送数据时都创建一个新套接字会产生相当多的开销。一遍又一遍地安排新任务也会增加很多开销,从而进一步减慢程序的速度。print 命令会增加一些开销,尤其是在输出大量数据的情况下。

其他要考虑的事情包括所涉及的系统计时器的精度、与硬件的交互、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()
于 2012-11-02T17:30:33.063 回答