python 多线程
多线程不等于高效
经测试,对于1亿次的随机数产生,一个线程执行的耗时小于两个线程的耗时。java与python都一样。
一个进程可以包含多个进程,python中每个进程有一个全局解释器锁(GIIL),通过该锁限制一个进程中每一时刻只有一个线程能够被CPU进程调度。
而通过python多进程则可以实现预期效果。
多线程运用场景
IO密集型与计算密集型
我们常见的通过多线程来提升效率的多为IO密集型。比如网络请求的发送与等待、文件的读写。
代码测试
python多进程测试
def random_method(N):
start = time.time()
for i in range(N):
random.randint(0, 10000000)
print(time.time() - start)
if __name__ == '__main__':
N = 10000000
random_method(N)
N = 5000000
print("多进程:")
t = multiprocessing.Process(target=random_method, args=(N,))
t.start()
t2 = multiprocessing.Process(target=random_method, args=(N,))
t2.start()
结果:
python多线程测试
def random_method(N):
start = time.time()
for i in range(N):
random.randint(0, 10000000)
print(time.time() - start)
if __name__ == '__main__':
N = 10000000
random_method(N)
N = 5000000
print("多线程:")
t = threading.Thread(target=random_method, args=(N,))
t.start()
t2 = threading.Thread(target=random_method, args=(N,))
t2.start()
结果:
java多线程测试
public class ThreadTest {
public static void main(String[] args) {
// 10亿次 - 24s
System.out.print("单线程");
random(500000000);
// 创建两个线程,每个线程执行2.5亿次,结果均为47s
System.out.println("多线程");
threadRandom();
}
private static void threadRandom() {
new Thread(()->{
random(250000000);
}).start();
new Thread(()->{
random2(250000000);
}).start();
}
private static void random(int N) {
long start = System.currentTimeMillis();
for (int i = 0; i < N; i++) {
double a = Math.random() * 10000000;
}
System.out.println("执行" + N / 100000000.0 + "亿次,耗时:" + (System.currentTimeMillis() - start));
}
private static void random2(int NUM) {
long start = System.currentTimeMillis();
for (int i = 0; i < NUM; i++) {
double a = Math.random() * 10000000;
}
System.out.println("执行"+ NUM/100000000.0 + "亿次,耗时:" + (System.currentTimeMillis() - start));
}
}