python基础-------进程线程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础-------进程线程相关的知识,希望对你有一定的参考价值。
Python中的进程线程(二)
一、python中的“锁”
1.GIL锁(全局解释锁)
含义:
Python中的线程是操作系统的原生线程,Python虚拟机使用一个全局解释器锁(Global Interpreter Lock)来互斥线程对Python虚拟机的使用。为了支持多线程机制,一个基本的要求就是需要实现不同线程对共享资源访问的互斥,所以引入了GIL。
GIL:在一个线程拥有了解释器的访问权之后,其他的所有线程都必须等待它释放解释器的访问权,即使这些线程的下一条指令并不会互相影响。
在调用任何Python C API之前,要先获得GIL。
GIL缺点:多处理器退化为单处理器;优点:避免大量的加锁解锁操作。
1.1GIL的影响
无论你启多少个线程,你有多少个cpu, Python在执行一个进程的时候会淡定的在同一时刻只允许一个线程运行。
所以,python是无法利用多核CPU实现多线程的。
这样,python对于计算密集型的任务开多线程的效率甚至不如串行(没有大量切换),但是,对于IO密集型的任务效率还是有显著提升的。
IO密集型案例:
import threading
import time
def foo(n):
time.sleep(n)
print("foo....%s" % n)
print(threading.activeCount())
def bar(n):
time.sleep(n)
print("bar......%s" % n)
s=time.time()
t1=threading.Thread(target=foo,args=(2,))
#t1.setDaemon(True)
t1.start()
t2=threading.Thread(target=bar,args=(5,))
#t2.setDaemon(True)
t2.start()
t1.join() # 阻塞主线程
t2.join()
print("++++++",threading.activeCount())
print("ending!")
print("cost time:",time.time()-s)
计算密集型案例:
import threading
import time
def foo(n):
ret=0
for i in range(n):
ret+=i
print(ret)
def bar(n):#计算密集型的任务指的是线程中存在大量的计算任务我们以阶乘和累加为例,通过传统的串行执行函数和计算。
ret=1
for i in range(1,n):
ret*=i
print(ret)
s=time.time()
t1=threading.Thread(target=foo,args=(100000000,))
t1.start()
t2=threading.Thread(target=bar,args=(100000,))
t2.start()
t1.join()
t2.join()
print("cost time:",time.time()-s)
以上是关于python基础-------进程线程的主要内容,如果未能解决你的问题,请参考以下文章