我必须在两台计算机之间创建 UDP 连接。 计算机 A 必须每 4 毫秒发送一次。向计算机 B 发送一个数据包,告诉 B 在哪里以及如何移动机械臂。 B电脑会传回 ARM 位置速度和加速度以及托运位置的误差...
A 计算机工作正常,它有我看不到的 C 代码程序,但这并不重要,因为我正在使用的机器人只接受 python 代码。 我一直在尝试在 B 计算机上使用多线程程序这样做,其中一个线程具有发送回错误和位置的唯一功能。
在这个小线程中,我试图确定发送 UDP 包 (teledirigido.fbk.send(...)) 所花费的时间,然后用 4 毫秒减去代码执行时间进行 sleep 。
class enviaDeterministico(threading.Thread):
def __init__(self,teledirigido):
self.teledirigido = teledirigido
# thanks to mordi
threading.Thread.__init__(self)
self.t = timeit.time
def run(self):
while 1:
self.empieza0 = self.t.time()
self.empieza = self.t.time()
self.teledirigido.cond.acquire()
self.teledirigido.fbk.send(self.teledirigido.lectura.enviarAmpliado())
self.acaba = self.t.time()
time.sleep((0.004-(self.acaba-self.empieza)))
self.teledirigido.cond.release()
self.acaba0 = self.t.time()
print 'tiempo entre envios %.6f'% (self.acaba0-self.empieza0)
第一个问题是 sleep 方法不存在于“(0.004-(self.acaba-self.empieza))”参数中,python 解释器说:
Exception in thread Thread-3:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "./conclase.py", line 210, in run
time.sleep(0.004-(self.acaba-self.empieza))
IOError: [Errno 22] Invalid argument
如果我使用 decsec。程序没有错误,而不是毫秒。
我发现的第二个也是最后一个问题是时间不是很确定。有没有办法在 python 中创建一个运行这段代码并退出的定时事件?
我有很多问题,我知道,我希望有人回答这个问题并且它对其他人有用。
谢谢大家! stackoverflow 和所有使用的人都很棒!
最佳答案
当您将否定参数传递给 time.sleep 时,您会得到 errno 22。
self.acaba 和 self.empieza 的值是什么?如果两次调用之间耗时超过 4 毫秒,这将失败。
获取定期回调取决于您的操作系统。您可以使用 SIGALRM 在 Unix 系统上获得它。参见 http://docs.python.org/library/signal.html有关更多信息。不过要小心:信号和线程不能很好地混合。
您还可以查看 stdlib 中的 sched 模块,它很好地集成在多线程代码中。
关于python - 使用 Python 建立确定性时间套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6731347/