【发布时间】:2011-04-23 13:51:39
【问题描述】:
我有许多设备需要从中获取状态更新。我只有一个套接字对象,而我只需要 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个套接字),它们能够同时等待数据?
提前致谢
【问题讨论】:
-
你为什么要锁?您是否共享任何资源?根据 POSIX,发送/接收是原子操作。可能是你没有很好地使用线程。你能分享你实现线程的代码吗?
标签: python multithreading sockets locking