我有许多设备需要获取状态更新。套接字对象就是我所拥有的,而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个套接字),它们能够同时等待数据?
提前致谢
答案 0 :(得分:0)
您需要阅读多少个不同的套接字?
如果答案是“几个”,那么组织这个的方法确实是每个套接字都有一个线程。 recv
是一个阻塞操作,它使一个线程成为组织代码的有吸引力的选项。每个线程都拥有一个单独的套接字,并在闲暇时从中读取。你应该没有问题和僵局。
只要没有资源共享,就不需要锁定。即使您共享资源(日志记录,某些数据存储等),也不要只使用简单的锁 - Python就像Queue
模块那样具有更高级别的实用程序。
答案 1 :(得分:0)
我知道这并没有回答你关于如何修复死锁问题的问题,但是看起来你的线程使用费用很高:
您可以使用一个线程,在该线程中使用select()
找出哪个套接字有可用数据,然后处理报告的数据。除非处理时间过长或协议更复杂select
应该没问题,并避免所有线程问题。
有关详细信息,请查看http://docs.python.org/howto/sockets.html#non-blocking-sockets。