我从这个问题中理解,如果我想拥有一个set线程安全的,我必须自己实现线程安全部分.
所以我想出来:
from threading import Lock
class LockedSet(set):
"""A set where add() and remove() are thread-safe"""
def __init__(self, *args, **kwargs):
# Create a lock
self._lock = Lock()
# Call the original __init__
super(LockedSet, self).__init__(*args, **kwargs)
def add(self, elem):
self._lock.acquire()
try:
super(LockedSet, self).add(elem)
finally:
self._lock.release()
def remove(self, elem):
self._lock.acquire()
try:
super(LockedSet, self).remove(elem)
finally:
self._lock.release()
Run Code Online (Sandbox Code Playgroud)
所以,当然只有add()和remove()在这个实现中是线程安全的.其他方法不是因为它们没有在子类中被覆盖.
现在,模式非常简单:获取锁定,调用原始方法,释放锁定.如果我遵循上面的逻辑,我将不得不以set基本相同的方式覆盖所有暴露的方法,例如:
(伪代码)
def <method>(<args>):
1. acquire lock
2. try:
3. call original method passing <args>
4. finally:
5. release lock …Run Code Online (Sandbox Code Playgroud) 我想在一个给定的密钥后面插入一个密钥OrdedDict.
例:
my_orderded_dict=OrderedDict([('one', 1), ('three', 3)])
Run Code Online (Sandbox Code Playgroud)
我想'two' --> 2进入正确的地方.
在我的情况下,我需要更新OrdedDict就地.
背景
Django的SortedDict(有一个insert())被删除:https://code.djangoproject.com/wiki/SortedDict
我正在制作一个群聊应用程序,并且我有与用户相关联的图像,所以每当他们说话时,他们的图像就会显示在它旁边。我用 python 编写了服务器,客户端将是一个 iOS 应用程序。我使用字典来存储所有的消息/图像对。每当我的 iOS 应用程序向服务器 ( msg:<message)发送命令时,字典都会像这样将图像和消息添加到字典中:dictionary[message] = imageName,它被转换为列表,然后在套接字中发送字符串。我想将传入的消息添加到字典的开头,而不是结尾。就像是
#When added to end:
dictionary = {"hello":image3.png}
#new message
dictionary = {"hello":image3.png, "i like py":image1.png}
#When added to start:
dictionary = {"hello":image3.png}
#new message
dictionary = {"i like py":image1.png, "hello":image3.png}
Run Code Online (Sandbox Code Playgroud)
有没有办法将对象添加到字典的开头?
我知道这与这个问题有关,但我最关心的是这是否可能会混淆诸如保留的评论等内容.
import ruamel.yaml as yaml
yaml_str = """\
first_name: Art
occupation: Architect # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
"""
data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
# I'd like to extend CommentedMap so that I can do something like:
data.insert(1, 'last_name', 'Vandelay')
print(yaml.dump(data, Dumper=yaml.RoundTripDumper))
Run Code Online (Sandbox Code Playgroud)
应输出:
first_name: Art
last_name: Vandelay
occupation: Architect # This is an occupation comment
about: Art Vandelay is a fictional character that George invents...
Run Code Online (Sandbox Code Playgroud)
如若不是输出:
first_name: …Run Code Online (Sandbox Code Playgroud)