Cat*_*lin 5 python multithreading twisted deep-copy
我有一个扭曲的服务器,它为每个请求执行一些"长"任务,所以我推迟每个调用的线程.在每个请求中,我访问一个公共资源,该资源在此过程中被更改.每个请求都应该以原始数据开头,因此我在公共资源上使用deepcopy(同时调用锁获取).它有效,但我认为它不够快.我觉得深度扫描会让事情变慢一些.
在处理具有资源突变的线程化扭曲服务器时,您有什么建议?
如果您愿意,您可以像在任何其他线程程序中一样同步对共享资源的访问,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)
这里的要点是,通过仔细使用锁,上述对象可能会在多个线程之间共享,而无需进行深度复制。识别可能需要这样做的所有情况并非易事,细粒度锁定策略可能更难以调试,并且仍然会带来开销。
也就是说,您可能根本不需要线程、锁或深度复制,并且如果不对代码进行基准测试,就不清楚是否存在需要解决的性能问题。我很好奇是什么让您认为您的代码应该或需要更快?