1个工作线程比4个快?

2024-06-02 08:50:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在阅读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个线程对列表的访问是一个瓶颈从而导致时间变慢还是我做错了什么?你知道吗


Tags: targetargs线程threadstartworkerprintthreading
1条回答
网友
1楼 · 发布于 2024-06-02 08:50:08

在您的例子中,Global Interpreter Lock实际上不是问题所在。你知道吗

默认情况下,线程并不能加快速度。在您的例子中,代码是CPU绑定的。没有线程在等待I/O(允许其他线程使用CPU)。如果您的代码需要100%的CPU,那么线程化只会使它更快,如果许多代码是独立的,而您的代码不是独立的:您的大多数代码都持有锁,因此没有其他线程可以继续。你知道吗

这就引出了速度放缓的原因:切换线程和争夺锁需要时间。在你的情况下,这就是吃12的原因。你知道吗

相关问题 更多 >