为什么我的多线程代码比单线程代码花费更多时间

时间:2011-03-19 14:35:29

标签: python multithreading

这是我的代码:

import re,threading

class key_value:

    def __init__(self,filename='a.txt'):
        self.filename = filename
    def __getitem__(self,key):
        file = open(self.filename,'r')
        data = file.read()
        value = re.findall(r''+str(key)+' - (\S+)',data)
        return value

    def __setitem__(self,key,value):
        data = open(self.filename).read()
        b = re.split(r'('+str(key)+' - )\S*', data)
        #
        if len(b) == 1:
            result = str(key)+' - '+str(value)
            result += '\n'
            file = open(self.filename,'a')
            file.write(result)
            return
        elif type(value) == type([]):
            result = "".join(str(x) + value.pop(0) if x == str(key)+' - ' else x for x in b)
        else :
            result = "".join(str(x) + str(value) if str(x) == str(key)+' - ' else x for x in b)

        file = open(self.filename,'w')
        file.write(result)
    def run(self):
        print 'the thread is running!!'

class do_thread(threading.Thread):
    def __init__(self,filename='a.txt',key=None,value=None):
        threading.Thread.__init__(self)
        self.filename = filename
        self.key=key
        self.value=value

    def run(self):
        print 'the thread is running!!'
        a = key_value(self.filename)

        if(self.key and self.value):
            a[self.key] = self.value
        elif(self.key):
            self.value = a[self.key]


#'''#Multi-threading code 
for i in range(1000):
    a = do_thread(key=i,value=i)
    #print 'the main programme'
    a.start()
    #a.join()
    #print 'game over'
'''# Single-threaded code 
for i in range(1000):
    a = key_value()
    a[i] = i

'''

我的老板告诉我在我的代码中添加多线程,

我添加它,但我发现多线程花费更多时间,

那么我的老板所说的多线程的用处是什么,

感谢

6 个答案:

答案 0 :(得分:3)

CPython(主要的Python实现)不是多线程的。 GIL妨碍了我们。所以你只需要在一个核心上运行两个线程(即它们不是并行运行),而是所有上下文切换和线程必需的其他开销。请注意:

  • 即使你做多线程,你仍然受到核心数量的限制。双核计算机只能同时进行两次计算,启动一千个线程不会改变它,无论它们是在两个核心之间分割还是全部在一个核心上运行。
  • 但是,如果你是例如运行更多线程而不是核心仍然有用做大量的I / O - CPU等待I / O无论如何都处于空闲状态,所以你不受CPU时间的限制。

编辑:从评论来看,您的计算机无论如何都无法进行多线程处理。好吧,上面仍然有效。

答案 1 :(得分:1)

应用程序是IO绑定而不是CPU绑定,因此多线程不会有帮助。

另外,如上所述,1,000个线程不会有效率,尝试较小的数字,即2 - 4,尝试大约 2×内核数是很受欢迎的。增加线程数太高将导致线程管理的开销导致应用程序显着变慢。

答案 2 :(得分:0)

当您必须同时访问不同的资源(文件,网络,用户界面......)时,多线程非常有用且高效。 在您的代码中,在我看来,您只访问一个ressource,一个文件,因此mutlti-thread的效率较低

答案 3 :(得分:0)

David Beazley对这一现象进行了很好的调查here。这是谈话的video。简而言之,您的线程彼此争斗以发送和响应信号以获取GIL。不,这不仅发生在CPU绑定线程上,IO绑定线程也会遇到同样的问题。

答案 4 :(得分:0)

我没有详细阅读您的代码,但是在多核计算机上进行测试,您可能会看到改进。

答案 5 :(得分:0)

一个原因是,由于读取开销,访问一个文件的时间实际上比同时访问多个文件要快得多。 (你知道磁盘的缓存有限,最好从头到尾读取文件作为流。)

无论如何,瓶颈是磁盘。你需要更多资源,这是最糟糕的。