python - 如何在python中实现线程socket.recv()?

标签 python multithreading sockets locking

我有许多设备需要从中获取状态更新。我只需要一个套接字对象,而我只需要 socket.recv() 来获取状态。放入单线程应用程序,不会出现问题:

class Device:
    def receive(self):
        log.debug("receive waiting: %r", self.device_id)
        try:
            packet = self.socket.recv(255)
        except Exception as e:
            self.report_socket_error(e)
            self.reconnect()
        log.debug("received response: %r", self.device_id)
d = Device()
d.connect()
while True:
    d.receive()

但是,包装在 threading.Thread 类中的相同代码会导致死锁和有趣的行为。用锁包裹它并没有改变任何东西。我将问题追溯到 socket.recv() 调用......那么,如何实现多个线程,其中每个线程拥有一个套接字(1 个线程独占 1 个套接字),它们能够同时等待数据?

提前致谢

最佳答案

我知道这并不能回答您有关如何解决死锁问题的问题,但是在您的情况下,它似乎是因为您使用线程是开销:

您可以只使用一个线程,在其中使用 select()找出哪个socket有可用数据,然后处理上报的数据。除非处理需要很长时间或您的协议(protocol)更复杂select应该没问题,避免所有线程问题。

看看http://docs.python.org/howto/sockets.html#non-blocking-sockets更多细节。

关于python - 如何在python中实现线程socket.recv()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5764534/

相关文章:

c# - 从 ProcessThread 到托管线程

ISO C 中的跨平台并发库

c - EV3 上的蓝牙

android - 设备之间的Android套接字

python - SWIG 忽略类中的 %mutable;如何解决?

python - 64 位整数与 64 位 float : which one has more values?

multithreading - 如何用时序图来说明多线程?

c++ - Linux 上 UDP 的延迟测量

python - 对列表理解的每个生成实体进行操作

python - 无法导入 keras.layers.Merge