我是 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()
请您参考如下方法:
首先,每次发送数据时都创建一个新套接字会产生相当大的开销。一遍又一遍地安排一个新任务也会增加很多开销,进一步减慢你的程序。打印命令会增加一些开销,尤其是当您输出大量数据时。
其他需要考虑的事情包括所涉及的系统计时器的精度、与硬件的交互、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()
