繁体   English   中英

1个工作线程比4个快?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM