我有许多设备需要从中获取状态更新。我只需要一个套接字对象,而我只需要 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/