对比python的进程和线程:多线程是假的

进程,是系统进行资源分配最小单位(拥有独立的内存单元)。(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倍左右,所以多线程是假的,是串行的。

猜你喜欢

转载自www.cnblogs.com/andy9468/p/9615090.html
今日推荐