使用Python建立确定性时间套接字连接

使用Python建立确定性时间套接字连接,python,multithreading,sockets,timing,Python,Multithreading,Sockets,Timing,我必须在两台计算机之间创建UDP连接。 计算机必须每4毫秒发送一次数据。一个数据包发送到计算机B,告诉B在哪里以及如何移动机械臂。 B计算机将传回手臂位置、速度和加速度以及交付和位置之间的误差 A计算机工作正常,它有我看不到的C代码程序,但这并不重要,因为我使用的机器人只接受python代码。 我一直在用一个多线程程序在B计算机上这样做,其中一个线程只有一个功能,即返回错误和位置 在这个小线程中,我试图确定发送UDP包(teledirigido.fbk.send(…)然后进行睡眠以从4毫秒减去代

我必须在两台计算机之间创建UDP连接。 计算机必须每4毫秒发送一次数据。一个数据包发送到计算机B,告诉B在哪里以及如何移动机械臂。 B计算机将传回手臂位置、速度和加速度以及交付和位置之间的误差

A计算机工作正常,它有我看不到的C代码程序,但这并不重要,因为我使用的机器人只接受python代码。 我一直在用一个多线程程序在B计算机上这样做,其中一个线程只有一个功能,即返回错误和位置

在这个小线程中,我试图确定发送UDP包(teledirigido.fbk.send(…)然后进行睡眠以从4毫秒减去代码执行时间所需的时间

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解释器说:

线程3中的异常:

回溯(最近一次呼叫最后一次):

文件“/usr/lib/python2.6/threading.py”,第532行,在引导程序内部

self.run()
文件“/conclase.py”,第210行,运行中

time.sleep(0.004-(self.acaba-self.empieza))
IOError:[Errno 22]参数无效

如果我使用decsec。程序没有给出错误,而是给出毫秒

我发现的第二个也是最后一个问题是,时间不太确定。有没有办法在python中生成一个定时事件,运行这段代码并退出

我有很多问题,我知道,我希望有人能回答这个问题,也希望它能对其他人有用


谢谢大家!stackoverflow和所有使用它的人都很棒

将否定参数传递给time.sleep时,会出现错误22

self.acaba和self.empieza的价值观是什么?如果两次调用之间经过的时间超过4ms,则会失败

获得定期回调取决于您的操作系统。您可以在带有SIGALRM的Unix系统上实现这一点。请参阅以了解更多关于此的信息。不过要小心:信号和线程不能很好地混合

您还可以查看stdlib中的sched模块,它在多线程代码中集成得很好

time.sleep(max(0, <your time formula>))  # protect from negative time

这不会跳过发送数据,但当然单个数据可能会延迟,即它具有正确的频率,但可能有一些抖动。

如果您将标识符翻译为英语,这将非常有用。我将检查两者的值,有时运行时间可能超过4毫秒。通常运行需要0.00047秒,但它不是确定性的。我也会检查信号的。谢谢!
class Timer(threading.Thread):
    def run(self):
        started = time.time()
        counter = 0
        while True:
            counter += 1
            now = time.time()
            if started + counter * 0.040 - now > 0:
                time.sleep(started + counter * 0.040 - now)
            # send datum number `counter`