簡體   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