【发布时间】:2012-05-29 16:56:34
【问题描述】:
几个小时前,我问了一个关于 Python 多线程的问题。为了了解它的工作原理,我进行了一些实验,以下是我的测试:
使用线程的 Python 脚本:
import threading
import Queue
import time
s = 0;
class ThreadClass(threading.Thread):
lck = threading.Lock()
def __init__(self, inQ, outQ):
threading.Thread.__init__(self)
self.inQ = inQ
self.outQ = outQ
def run(self):
while True:
global s
#print self.getName()+" is running..."
self.item = self.inQ.get()
#self.inQ.task_done()
ThreadClass.lck.acquire()
s += self.item
ThreadClass.lck.release()
#self.inQ.task_done()
self.outQ.put(self.item)
self.inQ.task_done()
inQ = Queue.Queue()
outQ = Queue.Queue()
i = 0
n = 1000000
print "putting items to input"
while i<n:
inQ.put(i)
i += 1
start_time = time.time()
print "starting threads..."
for i in xrange(10):
t = ThreadClass(inQ, outQ);
t.setDaemon(True)
t.start()
inQ.join()
end_time = time.time()
print "Elapsed time is: %s"%(end_time - start_time)
print s
以下内容具有与简单的 while 循环相同的功能:
import Queue
import time
inQ = Queue.Queue()
outQ = Queue.Queue()
i = 0
n = 1000000
sum = 0
print "putting items to input"
while i<n:
inQ.put(i)
i += 1
print "while loop starts..."
start_time = time.time()
while inQ.qsize() > 0:
item = inQ.get()
sum += item
outQ.put(item)
end_time = time.time()
print "Elapsed time is: %s"%(end_time - start_time)
print sum
如果您在您的机器上运行这些程序,您会发现线程比简单的 while 循环慢得多。我对线程有点困惑,想知道线程代码有什么问题。我该如何优化它(在这种情况下),为什么它比 while 循环慢?
【问题讨论】:
-
您之前的问题的答案有哪些不清楚的地方?总结:线程不会让一切变得更快(如果你在这里做的事情很少并且大部分时间都在锁定和排队,当然不会),即使是这样,CPython 线程也不会使用超过一个核心在任何给定的时间点。
-
我之前的问题是关于寻找错误,这是关于性能的
-
哦,对不起,我把你和昨天发布了一个非常相似的问题的另一个用户混淆了,请参阅python multi-threading slower than serial?,它可能很好地回答了你的问题(如果我会投票关闭重复如果有人证实了我的印象)。
-
@torayeff:简单地说,你的线程代码比非线程代码做更多的事情来执行相同的任务。不是所有的事情都可以通过使用线程来优化,而且线程也不仅仅用于优化。
-
@torayeff:
task_done()修改Queue.join()方法使用的计数器。Queue.join()将阻塞直到任务计数器降为零。如果您注释掉该行,您的所有线程将继续运行/完成,但您的主脚本将在您调用inQ.join()时永远阻塞。
标签: python multithreading thread-safety