python中的线程数是否有限制

时间:2017-07-01 10:04:31

标签: python linux multithreading

我尝试使用所有CPU,因此我使用了线程包

但是我得到类似的时间使用十个线程(在12个线程的cpu中)

我相信python有一个限制,但不确定,int top我只看到133%的CPU。

我把代码放了,但我认为这不是软件缺陷。

class normalizeTh(threading.Thread):
    def __init__(self, image, idx):
        self.image = image
        self.output = image
        self.idx = idx
        threading.Thread.__init__(self)

    def run(self):
        # print("test")
        self.output = exposure.equalize_adapthist(self.image, clip_limit=0.03)
numTheads = 10
def normalizeImgTh(X):
    global numThreads
    idx = 0
    dest = np.empty(X.shape)
    ths = []
    for img in tqdm(X):
        # if we have all threads used, wait until fist is free
        if len(ths) >= numThreads:
            ths[0].join()
            dest[ths[0].idx] = ths[0].output
            del ths[0]
        nTh = normalizeTh(img, idx)
        nTh.start()
        ths.append(nTh)
        idx += 1
        #delete all finished threads... garbage out
        for i in range(len(ths),0,-1):
            if not ths[i-1].is_alive():
                dest[ths[0].idx] = ths[0].output
                del ths[i-1]
    # wait for all pending threads.
    while len(ths) > 0:
        ths[0].join()
        dest[ths[0].idx] = ths[0].output
    return dest


dest=normalizeImgTh(X_train)

2 个答案:

答案 0 :(得分:3)

限制可能与硬件和操作系统设置有关,而不是与Python有关。如果您使用线程进行CPU绑定任务,我认为Python不会因全局解释器锁而提供帮助。

答案 1 :(得分:0)

我正在尝试使用所有CPU,所以我在使用线程包

但是使用十个线程中的一个(在12个线程中,我得到类似的时间) cpu)

我知道这个问题是三年前发布的。

如果您使用的是标准版本的Python,则系统一次只能执行一个Python线程,包括程序的主线程,因此,在程序中添加更多线程或在系统中添加更多核心不会在Python中使用线程模块时,您会得到真正的收获。您可以研究有关GIL / Global Interpreter Lock的所有详细信息和超crecrepidarian意见,以获取更多信息。

这意味着cpu绑定(计算密集型)代码不会因将其分解为线程而大大受益。

I / O绑定(等待文件读/写,网络读或用户I / O)代码从多线程中受益匪浅!因此,为与基于Python的服务器的每个网络连接启动一个线程。

线程还可以很好地在设定的时间触发/引发/引发信号,或者只是更逻辑地阻止代码的处理部分。

可能您想使用multiprocessing模块而不是threading