码迷,mamicode.com
首页 > 编程语言 > 详细

python基础-------进程线程(二)

时间:2017-07-19 21:59:15      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:函数   主线程   ext   api   引入   机制   set   互斥   tar   

  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基础-------进程线程(二)

标签:函数   主线程   ext   api   引入   机制   set   互斥   tar   

原文地址:http://www.cnblogs.com/niubin/p/7207753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!