![](/img/trans.png)
[英]Python multiprocessing with single worker faster than sequential operation
[英]1 worker thread faster than 4?
我将自己读入python的multighreading中,并提出了一个简单的测试:(顺便说一句,此实现可能非常糟糕,我只是为了测试目的而将其写下来。如果有什么大错,我将很感激,如果您能指出)
#!/usr/bin/python2.7
import threading
import timeit
lst = range(0, 100000)
lstres = []
lstlock = threading.Lock()
lstreslock = threading.Lock()
def add_five(x):
return x+5
def worker_thread(args):
print "started"
while len(lst) > 0:
lstlock.acquire()
try:
x = lst.pop(0)
except IndexError:
lstlock.release()
return
lstlock.release()
x = add_five(x)
lstreslock.acquire()
lstres.append(x)
lstreslock.release()
def test():
try:
t1 = threading.Thread(target = worker_thread, args = (1,))
#t2 = threading.Thread(target = worker_thread, args = (2,))
#t3 = threading.Thread(target = worker_thread, args = (3,))
#t4 = threading.Thread(target = worker_thread, args = (4,))
t1.start();
#t2.start();
#t3.start();
#t4.start();
t1.join();
#t2.join();
#t3.join();
#t4.join();
except:
print "Error"
print len(lstres)
if __name__ == "__main__":
t = timeit.Timer(test)
print t.timeit(2)
尽管有一个可怕的示例,但我看到以下内容:一个线程比4快。一个线程得到13.46秒,四个线程得到25.47秒。
通过4个线程访问列表是否是瓶颈,从而导致速度变慢或我做错了什么?
在您的情况下, Global Interpreter Lock实际上不是问题。
默认情况下,线程化不会使事情变得更快。 在您的情况下,代码受CPU限制。 没有线程正在等待I / O(这允许另一个人使用CPU)。 如果您的代码需要100%的CPU,那么只有在很多代码是独立的而不是您自己的代码的情况下,线程处理才能使其速度更快:大多数代码都持有锁,因此其他线程无法继续进行。
这使我们陷入了放缓的原因:切换线程和争夺锁会浪费时间。 在您的情况下,这就是吃12秒的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.