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

标签 python multithreading sockets timing

我必须在两台计算机之间创建 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/

相关文章:

python / flask : TypeError: an integer is required (got type str)

c++ - 单处理器上的其他线程是否可以看到内存重新排序?

c - Socket - 当有2个连续的crlf时接收客户端请求

c# - 在非管理员帐户上使用多个 PGM 监听套接字获取访问异常

c - 在内核中使用 sock_create、accept、bind 等

python - 列表理解或 map() 或 for 循环访问前一行来操作数组

python - 使用python在MySQL中多线程插入数据

java - JavaFX 中的复杂并发 : using ObservableLists and Properties from multiple worker threads

java - Java 的 ThreadLocal 是如何在底层实现的?

python - 机器人 Controller 代码: Error when loading