python 多线程

线程和进程

进程

进程是一个执行中的程序。每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据。操作系统管理其上所有进程的执行,并为这些进程合理地分配时间。进程也可以通过派生(fork或spawn)新的进程来执行其他任务,不过因为其他新进程也都拥有自己的内存和数据栈,所以只能采用进程间通信(IPC)的方式共享信息。

线程

线程与进程类似,不过它们是在同一个进程下执行的,并共享相同的上下文。可以将
它们认为是在一个主进程或“主线程”中并行运行的一些“迷你进程”。

一个进程中的各个线程与主线程共享同一片数据空间,因此相比于独立的进程而言,
线程间的信息共享和通信更加容易。线程一般是以并发方式执行的,正是由于这种并
行和数据共享机制,使得多任务间的协作成为可能。在单核CPU系统中,真正的并
行是不可能的,所以线程的执行实际上是这样规划的:每个线程运行一小会,然后让
步给其他线程。

这种共享是具有风险的。如果两个或多个线程访问同一片数据,由于数据访问顺序不
同,可能导致结果不一致。这种情况通常称为竞态条件。但大多数线程库都有一些同		
步源语,允许线程管理器控制执行和访问。

线程和python

全局解释器锁

python代码的执行是由python虚拟机(又名解释器主循环)进行控制的。
python在设计时在主循环中同时只能有一个控制线程在执行。
尽管python解释器中可以运行多个线程,但是在任意给定时刻只有一个线程会被解释
器执行。

对python虚拟机的访问是由全局解释器锁(GIL)控制的。这个锁就是用来保证同时只能有一个线程运行的。在多线程环境中,python虚拟机的执行流程为:
1.设置GIL
2.切换进一个线程去运行
3.执行下面操作之一:
	a。指定数量的字节码指令
	b。线程主动让出控制权(可以调用time.sleep(0)来完成)。
4.把线程设置回睡眠状态(切换出线程)
5.解锁GIL
6.重复上述步骤

退出线程

当一个线程完成函数的执行时,它就会退出。另外,还可以通过调用诸如thread.exit()之类的退出函数,或者sys.exit()之类的退出python进程的标准方法,亦或者抛出SystemExit异常,来使线程退出。不过,你不能直接“终止”一个线程。
不建议使用thread模块。其中一个原因是在主线程退出后,所有其他线程都会在没有清理的情况下直接退出。而threading会确保在所有“重要的”子线程退出前,保持整个进程的存活。

在python中使用线程

import thread
若线程是可用的,则不会产生错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值