当前位置:   article > 正文

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

都说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倍左右,所以多线程是假的,是串行的。

python并发的解决办法:

1、用多进程。

2、用C、C++改写高效部分代码生成动态库(Linux中*.so,win中*.dll),用ctypes模块将动态库引入。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/143567
推荐阅读
相关标签
  

闽ICP备14008679号