Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 扭曲的线程如何避免deepcopy_Python_Multithreading_Twisted_Deep Copy - Fatal编程技术网

Python 扭曲的线程如何避免deepcopy

Python 扭曲的线程如何避免deepcopy,python,multithreading,twisted,deep-copy,Python,Multithreading,Twisted,Deep Copy,我有一个twisted服务器,它对每个请求都执行一些“长”任务,所以我会延迟执行每个调用。在每个请求中,我访问一个公共资源,该资源在过程中会被更改。每个请求都应该以原始数据开始,因此我在公共资源上使用deepcopy(同时调用锁获取)。它能工作,但我认为它不够快。我觉得deepcopy的速度有点慢 在处理带有资源变异的线程化twisted服务器时,您有什么建议?如果您愿意,您可以使用线程化同步对共享资源的访问。锁定,就像在任何其他线程化程序中一样,而不是复制它 不管怎样,我认为在进行优化之前,在

我有一个twisted服务器,它对每个请求都执行一些“长”任务,所以我会延迟执行每个调用。在每个请求中,我访问一个公共资源,该资源在过程中会被更改。每个请求都应该以原始数据开始,因此我在公共资源上使用deepcopy(同时调用锁获取)。它能工作,但我认为它不够快。我觉得deepcopy的速度有点慢


在处理带有资源变异的线程化twisted服务器时,您有什么建议?

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

不管怎样,我认为在进行优化之前,在使用和不使用deepcopy的情况下对您的代码进行基准测试,或者进行其他测量,以了解性能到底有多好/有多差是值得的。也许它速度慢的原因与deepcopy无关

关于使用锁定的编辑:我的意思是,您可以在这个资源周围使用更细粒度的锁定。我假设您的线程所做的不仅仅是访问共享资源。您可以尝试从多个线程的工作中获益,然后同步对只涉及写入共享资源的一个“关键部分”的访问。您还可以研究使共享资源线程安全。例如,如果您有一个共享对象,
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()
这里的要点是,通过谨慎使用锁,上述对象可能在多个线程之间共享,而无需使用deepcopy。识别所有可能需要这样做的情况并非易事,细粒度锁定策略可能更难调试,并且仍然会引入开销


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

尝试在工作线程中使用尽可能少的数据进行操作。将他们需要的所有数据作为参数传入,并将其所有输出作为返回值(延迟触发的值),而不是作为输入的突变

然后将结果集成到reactor线程中的公共数据结构中


这使您可以独立地对工作进行推理,并避免任何额外的锁定(这会导致争用,不仅会使事情变得更加混乱,还会使事情变得缓慢)。

在什么是不够快的?您的服务器是否每秒无法处理N个请求?单个请求有时会花费太长时间吗?是否随着并发请求数量的增加而变慢?单个请求不会花费太长时间。当我增加并发请求的数量时,它不会变慢。Twisted reactor线程池大小设置为25。对于“基准测试和概要文件优先”的感觉,一个明确的+1。人们经常优化错误的东西,即使他们知道某些东西实际上很慢。如果我用线程同步对资源的访问。锁定意味着我使用单线程。基准测试这件事肯定是要做的。在CPython中,列表上的单个操作是线程安全的,因此
SharedList
在这里没有做任何有用的事情。@JP,这是一个很好的观点。我已经更新了以使它更清楚。谢谢你的帮助。我们做了一些基准测试,发现deepcopy不是问题所在。深度复制调用大约需要:0.0009秒/次调用,这并不重要。您是否碰巧有一些示例/教程可供分享?