赞
踩
进程,是系统进行资源分配最小单位(拥有独立的内存单元)。(python中多进程是真的)
线程,是操作系统最小的执行单位(共享内存资源),比进程还小。(python中多线程是假的,因为cpython解释器中的一个模块GIL(全局解释器锁),GIl功能和互斥锁相似。)
证明过程:
(一)多进程
import multiprocessing
import os
import time
def add2():
start_time = time.time()
for i in range(100000000):
pass
end_time = time.time()
use_time = end_time - start_time
print("进程id: %s use_time: %s" % (os.getpid(), use_time))
if __name__ == '__main__':
print("【进程测试】")
p1 = multiprocessing.Process(target=add2, args=(), name="p1-进程")
print("p1.name :%s" % p1.name)
p2 = multiprocessing.Process(target=add2, args=(), name="p2-进程")
start_time = time.time()
p1.start()
p2.start()
p1.join()
p2.join()
end_time = time.time()
use_time = end_time - start_time
print("主进程id:%s use_time: %s" % (os.getpid(),use_time))
print("====主进程单独运行一次循环耗时:=====")
add2()
多进程运行结果:
(二)多线程
import threading
import time
def add2():
start_time = time.time()
for i in range(100000000):
pass
end_time = time.time()
use_time = end_time - start_time
print("线程id:%s 耗时:%s" % (threading.current_thread().ident, use_time))
if __name__ == '__main__':
print("【线程测试】")
print("主线程:%s 主线程id:%s" % (threading.current_thread(), threading.current_thread().ident))
t1 = threading.Thread(target=add2, args=(), name="t1-线程")
t2 = threading.Thread(target=add2, args=(), name="t2-线程")
start_time = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
end_time = time.time()
use_time = end_time - start_time
print("线程id:%s 耗时:%s (主线程)" % (threading.current_thread().ident, use_time))
print("====主线程单独运行一次循环耗时:=====")
add2()
多线程运行结果:
(三)结论:
不论是线程还是进程,循环单独运行的时间都是差不多的4秒内。
而多线程的总耗时基本上是单独循环一次耗时的2倍左右,所以多线程是假的,是串行的。
python并发的解决办法:
1、用多进程。
2、用C、C++改写高效部分代码生成动态库(Linux中*.so,win中*.dll),用ctypes模块将动态库引入。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。