如何在python中实现threaded socket.recv()?
我有许多设备需要从中获取状态更新。我只有一个socket对象,而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
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()调用……那么,如何实现多个线程,其中每个线程拥有一个套接字(一个线程独占一个套接字),这些线程能够同时等待数据
提前感谢您需要从多少个不同的插座读取数据
- 如果答案是“只有一个”,那么只使用一个线程。正如你发现的那样,添加另一个对你没有任何帮助,只会使你的生活复杂化
- 如果答案是“多个”,那么组织它的一种方法实际上是每个套接字有一个线程
是一种阻塞操作,它使线程成为组织代码的一个有吸引力的选项。每个线程都有一个单独的套接字,可以在空闲时从中读取数据。你应该没有问题和死锁 只要不共享资源,就不需要锁。即使您共享资源(日志记录、一些数据存储等),也不要只使用简单的锁—Python有更高级别的实用程序,如recv
模块队列
- 如果答案是“只有一个”,那么只使用一个线程。正如你发现的那样,添加另一个对你没有任何帮助,只会使你的生活复杂化
- 如果答案是“多个”,那么组织它的一种方法实际上是每个套接字有一个线程
是一种阻塞操作,它使线程成为组织代码的一个有吸引力的选项。每个线程都有一个单独的套接字,可以在空闲时从中读取数据。你应该没有问题和死锁 只要不共享资源,就不需要锁。即使您共享资源(日志记录、一些数据存储等),也不要只使用简单的锁—Python有更高级别的实用程序,如recv
模块队列
select()
找出哪个套接字具有可用数据,然后处理报告的数据。除非处理需要很长时间或协议更复杂,否则选择应该很好,并避免所有线程问题
请查看更多详细信息。我知道这并不能回答您关于如何解决死锁问题的问题,但在您的情况下,线程的使用似乎是开销: 您可以只使用一个线程,在其中使用
select()
找出哪个套接字具有可用数据,然后处理报告的数据。除非处理需要很长时间或协议更复杂,否则选择应该很好,并避免所有线程问题
查看更多详细信息。为什么要上锁?您是否共享任何资源?根据POSIX发送/接收是原子操作。可能是您没有很好地使用线程。你能在实现线程的地方共享代码吗?为什么要加锁?您是否共享任何资源?根据POSIX发送/接收是原子操作。可能是您没有很好地使用线程。您可以在实现线程的地方共享代码吗?