线程的概念及Thread模块的使用
线程
一.什么是线程?
我们可以把进程理解成一个资源空间,真正被CPU执行的就是进程里的线程。
一个进程中最少会有一条线程,同一进程下的每个线程之间资源是共享的。

二.开设线程的两种方式
开设进程需要做哪些操作
1.重新申请一块内存空间
2.将所需的资源全部导入
开设线程需要做哪些操作
上述两个步骤都不需要 所以开设线程消耗的资源远比开设进程的少!!!
from threading import Thread # 线程模块
import time
# 正常方法
def test(name):
print(f'{name} is running')
time.sleep(2)
print(f'{name} is over')
t = Thread(target=test, args=('jason',))
t.start()
print('主线程')
# 重写类方法
class Myclass(Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print(f'{self.name} is running')
time.sleep(3)
print(f'{self.name} is over')
t = Myclass('jason')
t.start()
print('主线程')


线程对象的其他方法
from threading import Thread, active_count, current_thread
def test(name):
print(f'{name} is running')
print(current_thread().name)
time.sleep(2)
print(f'{name} is over')
t = Thread(target=test, args=('jason',))
t.start()
print(current_thread().name)
t.join() # 等待子线程执行完再执行主线程(和进程的join一样)
print('主线程')


三.守护线程
定义
随着守护线程的主线程结束,子线程也会立即关闭, 所以主线程需要等待里面所有非守护线程的结束才能结束
开启方式和上面的守护进程一样,在线程的start开启前,加入线程名.dameo = True 即可开启该线程的守护线程
小练习
下面的代码的打印顺序是如何的:
from threading import Thread
from multiprocessing import Process
import time
def foo():
print(123)
time.sleep(3)
print("end123")
def bar():
print(456)
time.sleep(1)
print("end456")
if __name__ == '__main__':
t1=Thread(target=foo)
t2=Thread(target=bar)
t1.daemon=True
t1.start()
t2.start()
print("main-------")

四.线程数据共享
from threading import Thread
money = 100
def test():
global money
money = 999
t = Thread(target=test)
t.start()
t.join()
print(money)

五.线程互斥锁
和进程互斥锁一样,都是为了解决并发带来的修改同一数据时,数据错乱的情况,虽然减少了效率但是增加了数据的安全性。
加锁
from threading import Thread, Lock
import time
num = 100
def test():
locked.acquire() # 放置锁
global num
# 先获取num的数值
tmp = num
# 模拟延迟效果
time.sleep(0.05)
# 修改数值
tmp -= 1
num = tmp
locked.release() # 解除锁
t_list = []
locked = Lock() # 生成锁
for i in range(100):
t = Thread(target=test)
t.start()
t_list.append(t)
# 确保所有子线程全部结束
for t in t_list:
t.join()
print(num)
线程的概念及Thread模块的使用的更多相关文章
- 进程的概念及multiprocess模块的使用
一.进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在 ...
- python全栈开发 * 线程锁 Thread 模块 其他 * 180730
一,线程Thread模块1.效率更高(相对于进程) import time from multiprocessing import Process from threading import Thre ...
- 【Python@Thread】thread模块
一.关于Python多线程 Python解释器中可以同时运行多个线程,但是再任意时刻只能有一个线程在解释器运行. Python虚拟机的访问是由全局解锁器(GIL)控制的,由GIL保证同时只有一个线程的 ...
- Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块
Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fab ...
- python标准库介绍——33 thread 模块详解
?==thread 模块== (可选) ``thread`` 模块提为线程提供了一个低级 (low_level) 的接口, 如 [Example 3-6 #eg-3-6] 所示. 只有你在编译解释器时 ...
- thread模块—Python多线程编程
Thread 模块 *注:在实际使用过程中不建议使用 thread 进行多线程编程,本文档只为学习(或熟悉)多线程使用. Thread 模块除了派生线程外,还提供了基本的同步数据结构,称为锁对象(lo ...
- 【转】php Thread Safe(线程安全)和None Thread Safe(NTS,非 线程安全)之分
Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...
- Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分
Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...
- 【转】java线程系列---Runnable和Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
随机推荐
- CF678F题解
首先题意中的有撤销操作,直接李超树肯定不行,题目允许离线,所以考虑线段树分治 所以问题就变成了求一次函数最大值 这不是李超树板子吗??? 然后可以对每个节点都建立动态开点李超树,查询的时候直接从叶子节 ...
- Java将彩色PDF转为灰度
本文以Java代码为例介绍如何实现将彩色PDF文件转为灰度(黑白)的PDF文件,即:将PDF文档里面的彩色图片或者文字等通过调用PdfGrayConverter.toGrayPdf()方法转为文档页面 ...
- linux下yum无法安装lrzsz,Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal
镜像下载.域名解析.时间同步请点击阿里云开源镜像站 linux虚拟机上准备安装一下rz sz,执行yum命令后提示如下: [root@tony001 ~]# yum install lrzsz Cen ...
- 6月20日 Django中ORM介绍和字段、字段参数、相关操作
一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...
- .net core 配置Swagger 摆脱PostMan,你值得拥有这样的api调试方式
废话不多说直接来看 第一步: 安装nuget包:Swashbuckle.AspNetCore.Swagger Swashbuckle.AspNetCore.SwaggerGen Swashbuckle ...
- linux的一些sao东西
1.sys命令的目录 /usr/include/asm-generic
- spring-boot-关于module自定义jar包打包无法给其他module使用
####世界大坑: 如果仅是使用 <build> <plugins> <plugin> <groupId>org.springframework.boo ...
- 怎样在方法里面得到Request,或者Session?
直接在方法的形参中声明request,SpringMvc就自动把request对象传入.
- CopyOnWriteArrayList 可以用于什么应用场景?
CopyOnWriteArrayList(免锁容器)的好处之一是当多个迭代器同时遍历和修改这 个列表时,不会抛出 ConcurrentModificationException.在 CopyOnWri ...
- spring-boot--lernning之自定义starters
思路: 1这个场景需要使用到的依赖是什么??? 2如何编写自动配置 @Configuration 指定这个类是一个配置类 @ConditionalOnXXXX 指定条件下成立的情况下自动配置类生效 @ ...