Skip to main content
 首页 » 编程设计

python之我是否需要锁定来保护我的代码中的多线程竞争条件

2025年05月04日25Renyi-Fan

在 Windows 上使用 Python 2.7,并将使用支持真正多线程的 Jython。 sendMessage 方法用于接收来自特定客户端的消息,客户端可能会向其他几个客户端发送相同的消息(这就是参数 receivers 的作用,并且receivers 是一个列表)。 receiveMessage 方法用于接收从其他客户端发送给特定客户端的消息。

问题是我是否需要为方法 sendMessage 和 receiveMessage 加锁?我认为没有必要,因为即使客户端 X 正在接收其消息,另一个客户端 Y 附加到消息池以将消息传递给客户端 X 也是完美的。我认为对于 defaultdict/list,append/pop 是既原子又不需要保护。

如果我错了,请随时纠正我。

from collections import defaultdict 
 
class Foo: 
    def __init__(self): 
        # key: receiver client ID, value: message 
        self.messagePool = defaultdict(list) 
    def sendMessage(self, receivers, message): 
        # check valid for receivers 
        for r in receivers: 
            self.messagePool[r].append(message) 
    def receiveMessage(self, clientID): 
        result = [] 
        while len(self.messagePool[clientID]) > 0: 
            result.append(self.messagePool[clientID].pop(0)) 
 
        return result 

请您参考如下方法:

我建议使用 Queue 而不是 list。它是为带锁的线程中的 append\pop 而设计的。