相关疑难解决方法(0)

如何使内置容器(集,字符串,列表)线程安全?

从这个问题中理解,如果我想拥有一个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)

python multithreading thread-safety

16
推荐指数
1
解决办法
8839
查看次数

在键"foo"后面插入OrderedDict(inplace)

我想在一个给定的密钥后面插入一个密钥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 ordereddictionary

6
推荐指数
1
解决办法
9141
查看次数

将对象添加到字典的开头

我正在制作一个群聊应用程序,并且我有与用户相关联的图像,所以每当他们说话时,他们的图像就会显示在它旁边。我用 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)

有没有办法将对象添加到字典的开头?

python dictionary chat prepend

6
推荐指数
3
解决办法
1万
查看次数

我可以在ruamel.yaml的CommentedMap中插入一行吗?

我知道这与这个问题有关,但我最关心的是这是否可能会混淆诸如保留的评论等内容.

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)

python yaml ordereddictionary ruamel.yaml

5
推荐指数
1
解决办法
2548
查看次数