这是我的代码:
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 :(得分:3)
编辑:从评论来看,您的计算机无论如何都无法进行多线程处理。好吧,上面仍然有效。
答案 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)
一个原因是,由于读取开销,访问一个文件的时间实际上比同时访问多个文件要快得多。 (你知道磁盘的缓存有限,最好从头到尾读取文件作为流。)
无论如何,瓶颈是磁盘。你需要更多资源,这是最糟糕的。