首先我们应该应该明白进程和线程的概念
进程就是程序的一次执行过程,线程是处理器最小的执行单位,一个进程可以有很多线程,一个线程只能属于一个进程。
一个进程内的各个线程共享一块数据空间,当线程需要并发时,这就涉及到线程的执行顺序问题。因为线程的执行顺序不同可能会导致结果不同。如果多个线程共同访问一片数据,由于数据访问顺序不一样,导致结果不同(临界区)下面会有例子说明
下面介绍python的全局解释器锁(GIL)
这个锁能够保证同一时刻只有一个线程运行,可能大家这里就有疑问了,不是说要并发吗???其实并发只是宏观上同时运行,微观上是各个线程交替运行(按什么样顺序去执行才是我们要考虑的问题)。例如:调用IO之前线程会释放这个锁,为了避免浪费等待IO的时间,关于这个锁不再多说,
python中thread和threading模块选择
推荐使用threading模块,因为有更好的同步机制,还有就是因为thread模块主线程退出会强制所有子线程退出,会出现一个意想不到的结果。threading支持守护线程,主线程退出去,会保留一些比较重要的线程,可以用thread.setDaemon(True)标记为重要线程
下面代码演示这是我使用threading,比较喜欢的一种方式
import threading
from time import ctime, sleep
class mythread(threading.Thread):
# 子类化创建线程,方便调用和集中管理
def __init__(self,func,args):
threading.Thread.__init__(self)
self.func=func
self.args=args
def __call__(self):
self.func(*self.args)#声明该子类是可以被调用的对象,不加这句话会有错误,不能调用
def loop(nesc,i):
print('starting thread ',i)
sleep(nesc)
print('finish ', i)
def main():
loops=[4,2]
threads=[]
nloops=range(len(loops))
for i in nloops:
t=threading.Thread(target=mythread(loop,args=(loops[i],i)))
threads.append(t)
for i in nloops:
# 开启线程
threads[i].start()
for i in nloops:
# 等待结束
threads[i].join()
print("all done")
if __name__ =='__main__':
main()
运行结果:
starting thread 0
starting thread 1
finish 1
finish 0
all done
因为我也是初学python,以上内容参考python核心编程这本书,大家也可以去看一下。
以后我会把我的学习笔记,贡献出来,有什么错误,欢迎指出,大家一起学习