2011-03-19 66 views
0

这是我的代码:为什么我的多线程代码,花更多的时间比单线程代码

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 

''' 

我的老板告诉我要多线程添加到我的代码,

我添加它,但我觉得多线程花费更多的时间,

究竟什么是有用的多线程,我的老板说的,

感谢

+0

您是否在多核计算机上试过了? – BenjaminB 2011-03-19 14:38:27

+0

不,我的电脑是单核的 – zjm1126 2011-03-19 14:42:37

+0

您正在产生1000个线程,并且启动一个线程会产生一些开销。线程为您提供了并行性,但不会自动让事情变得更快。在你的例子中,他们都在同一时间写入同一个文件,这不可能是你想要的。 – samplebias 2011-03-19 14:43:07

回答

3

CPython(主要的Python实现)不是多线程的。 GIL阻碍。所以你只需要在一个内核上运行两个线程(即它们不会并行运行),但是所有上下文切换以及线程必须具有的其他开销。注意虽然:

  • 即使你做多线程,你仍然受到核心数量的限制。双核计算机只能同时进行两次计算,启动一千个线程不会改变这种情况,无论它们是在两个核心之间进行拆分还是全部在一个核心上运行。
  • 但是,如果您正在运行更多的内核,那么运行比内核更多的线程仍然很有用。做大量I/O - CPU在等待I/O完成时处于空闲状态,因此您不受CPU时间限制。

编辑:从评论看来,你的电脑似乎无法使用多线程。那么,上述仍然成立。

+0

所以你知道如何维护2个线程 – zjm1126 2011-03-19 14:58:46

0

当您必须同时访问不同的资源(文件,网络,用户界面...)时,多线程才是有用且高效的。 在你的代码中,在我看来,你只能访问一个资源,一个文件,所以多线程效率较低

1

应用程序是IO绑定而不是CPU绑定,所以多线程不会帮助。

另外,如上所述,1,000个线程不会很有效率,尝试更小的数字,即2 - 4,这是受欢迎的尝试多达2×核心数量。线程数量过高会导致线程管理开销,导致应用程序显着变慢。

0

David Beazley对这种现象做了很好的调查here。这是谈话的video。简而言之,你的线程正在相互作战,以发送和响应信号来获取GIL。不,这不仅发生在CPU绑定线程上,IO绑定线程也遭受同样的问题。

0

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

0

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

反正瓶颈是磁盘。你需要更多的资源,最糟糕的是它。