扭曲线程如何避免深度复制

Cat*_*lin 5 python multithreading twisted deep-copy

我有一个扭曲的服务器,它为每个请求执行一些"长"任务,所以我推迟每个调用的线程.在每个请求中,我访问一个公共资源,该资源在此过程中被更改.每个请求都应该以原始数据开头,因此我在公共资源上使用deepcopy(同时调用锁获取).它有效,但我认为它不够快.我觉得深度扫描会让事情变慢一些.

在处理具有资源突变的线程化扭曲服务器时,您有什么建议?

std*_*err 2

如果您愿意,您可以像在任何其他线程程序中一样同步对共享资源的访问,threading.Lock而不是复制它。

无论如何,我认为值得在使用和不使用深度复制的情况下对代码进行基准测试,并在进行优化之前进行测量以找出性能的好坏。也许它慢的原因与深度复制无关。

关于使用锁定的编辑:我的意思是您可以对该资源使用更细粒度的锁定。我假设您的线程所做的不仅仅是访问共享资源。您可以尝试从执行工作的多个线程中受益,然后同步对涉及写入共享资源的一个“关键部分”的访问。您还可以研究使共享资源线程安全。例如,如果有一个共享对象SillyExampleFriendsList

class SillyExampleFriendsList(object):
    """Just manipulates a couple lists"""
    def __init__(self):
       self._lock = threading.RLock()
       self._friends = []
       self._enemies = []

    def unfriend(self, x):
       # we lock here to ensure that we're never in a state where
       # someone might think 'x' is both our friend and our enemy.
       self._lock.acquire()
       self._friends.remove(x)
       self._enemies.append(x)
       self._lock.release()
Run Code Online (Sandbox Code Playgroud)

这里的要点是,通过仔细使用锁,上述对象可能会在多个线程之间共享,而无需进行深度复制。识别可能需要这样做的所有情况并非易事,细粒度锁定策略可能更难以调试,并且仍然会带来开销。

也就是说,您可能根本不需要线程、锁或深度复制,并且如果不对代码进行基准测试,就不清楚是否存在需要解决的性能问题。我很好奇是什么让您认为您的代码应该或需要更快?