如何在python中实现threaded socket.recv()?

如何在python中实现threaded socket.recv()?,python,multithreading,sockets,locking,Python,Multithreading,Sockets,Locking,我有许多设备需要从中获取状态更新。我只有一个socket对象,而socket.recv()是获取状态所需的全部。在单线程应用程序中,不会出现任何问题: class Device: def receive(self): log.debug("receive waiting: %r", self.device_id) try: packet = self.socket.recv(255) except Exception

我有许多设备需要从中获取状态更新。我只有一个socket对象,而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()调用……那么,如何实现多个线程,其中每个线程拥有一个套接字(一个线程独占一个套接字),这些线程能够同时等待数据


提前感谢

您需要从多少个不同的插座读取数据

  • 如果答案是“只有一个”,那么只使用一个线程。正如你发现的那样,添加另一个对你没有任何帮助,只会使你的生活复杂化
  • 如果答案是“多个”,那么组织它的一种方法实际上是每个套接字有一个线程
    recv
    是一种阻塞操作,它使线程成为组织代码的一个有吸引力的选项。每个线程都有一个单独的套接字,可以在空闲时从中读取数据。你应该没有问题和死锁

    只要不共享资源,就不需要锁。即使您共享资源(日志记录、一些数据存储等),也不要只使用简单的锁—Python有更高级别的实用程序,如
    队列
    模块


您必须从多少个不同的插座读取数据

  • 如果答案是“只有一个”,那么只使用一个线程。正如你发现的那样,添加另一个对你没有任何帮助,只会使你的生活复杂化
  • 如果答案是“多个”,那么组织它的一种方法实际上是每个套接字有一个线程
    recv
    是一种阻塞操作,它使线程成为组织代码的一个有吸引力的选项。每个线程都有一个单独的套接字,可以在空闲时从中读取数据。你应该没有问题和死锁

    只要不共享资源,就不需要锁。即使您共享资源(日志记录、一些数据存储等),也不要只使用简单的锁—Python有更高级别的实用程序,如
    队列
    模块


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

您可以只使用一个线程,在其中使用
select()
找出哪个套接字具有可用数据,然后处理报告的数据。除非处理需要很长时间或协议更复杂,否则选择应该很好,并避免所有线程问题


请查看更多详细信息。

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

您可以只使用一个线程,在其中使用
select()
找出哪个套接字具有可用数据,然后处理报告的数据。除非处理需要很长时间或协议更复杂,否则选择应该很好,并避免所有线程问题


查看更多详细信息。

为什么要上锁?您是否共享任何资源?根据POSIX发送/接收是原子操作。可能是您没有很好地使用线程。你能在实现线程的地方共享代码吗?为什么要加锁?您是否共享任何资源?根据POSIX发送/接收是原子操作。可能是您没有很好地使用线程。您可以在实现线程的地方共享代码吗?