Multithreading 线程化python中的只读numpy数组
我有多个使用numpy数组的线程Multithreading 线程化python中的只读numpy数组,multithreading,numpy,python-multithreading,Multithreading,Numpy,Python Multithreading,我有多个使用numpy数组的线程 import threading import numpy as np import time shared_array = np.ones((5, 5)) def run(shared_array, nb_iters): k = shared_array**2 for i in range(nb_iters): k+=2 def multi_thread(): jobs = [] for _ in range(
import threading
import numpy as np
import time
shared_array = np.ones((5, 5))
def run(shared_array, nb_iters):
k = shared_array**2
for i in range(nb_iters):
k+=2
def multi_thread():
jobs = []
for _ in range(5):
thread = threading.Thread(target=run, args=(shared_array, 1000000))
jobs.append(thread)
for j in jobs:
j.start()
for j in jobs:
j.join()
t0 = time.time()
multi_thread()
print(time.time() - t0)
#result: 6.502177000045776
t0 = time.time()
# we used 1000000 iterations for each thread => total nb of iterations = 5 * 1000000
run(shared_array, 1000000 * 5)
print(time.time() - t0)
#result: 6.6372435092926025
问题是在添加numpy数组作为参数后,5个并行线程的执行时间等于一个顺序执行
所以我想知道如何使一个程序(类似于这个程序)并行,这是一个糟糕的例子。Python有一个内部锁(全局解释器锁,GIL),这意味着一次只能有一个线程执行Python代码。当你进入numpy时,它可以并行运行,但是因为你的数组太小,你几乎没有花时间在numpy上,所以你没有任何并行性可言。Python线程不会并行运行,由于全局解释器锁,一次只能运行一个线程。既然线程不能执行相同的功能,那么线程模块的用途是什么?我如何使用多线程解决这个问题?既然只有一个线程在执行,为什么线程中会有Barrier和Lock类?既然线程不能执行相同的功能,那么线程模块的用途是什么?我如何使用多线程解决这个问题?既然只有一个线程在执行,为什么线程中有屏障和锁类?Python线程非常适合I/O绑定的工作负载,以及花费大量时间在C模块(如numpy、pandas和TensorFlow)中的工作负载,这些模块为您释放锁。线程对于CPU限制的纯Python工作负载是无用的。