我尝试使用所有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)
答案 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
。