我有一个扭曲的服务器,每个请求都会执行一些“长时间”任务,因此我推迟了每个调用的线程。在每个请求中,我访问一个共同的资源,该资源在处理过程中被修改。每个请求应该从原始数据开始,所以我在共同的资源上使用了深度复制(同时调用锁定获取)。它有效,但我认为速度不够快。我有一种感觉,深度复制会使事情变慢。
当在线程扭曲服务器中处理资源突变时,您有什么建议?
当在线程扭曲服务器中处理资源突变时,您有什么建议?
尽可能使用最少的数据在工作线程中操作。将它们需要的所有数据作为参数传递,并将它们的所有输出作为返回值(即Deferred触发的值),而不是输入的变化。
然后在反应器线程中将结果集成到公共数据结构中。
这样可以使您独立地处理工作并避免任何额外的锁定(这会导致争用,在降低速度的同时使事情更加混乱)。
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()