python之线程,不得不了解的硬知识!
一、什么是线程
进程:资源单位
线程:执行单位
进程:资源单位(起一个进程仅仅只是在内存空间中开辟一块独立的空间)
线程:执行单位(真正被cpu执行的其实是进程里面的线程,线程指的就是代码的执行过程,执行代码中所需要使用到的资源都找所在的进程索要)
进程和线程都是虚拟单位,只是为了我们更加方便的描述问题
二、为什么要有线程
- 开设进程
1.申请内存空间 耗资源
2.“拷贝代码” 耗资源 - 开线程
一个进程内可以开设多个线程,在用一个进程内开设多个线程无需再次申请内存空间操作 - 总结:
开设线程的开销要远远的小于进程的开销
同一个进程下的多个线程数据是共享的!!!
三、怎么开启线程
- 开进程和开线程的步骤基本都是一样的 只是导入的模块不一样而已
- 开进程代码必须写在main下面而开线程则无需这么做
3.1、方式一
from threading import Thread
import timedef task(name):print(F'{name} is running')time.sleep(1)print(F'{name} is stopping')# 开线程的代码不需要写在main中
# 但是习惯性的将启动命令写在main下面t = Thread(target=task,args=('tzh',))
t.start()
print('我是主线程')
3.2、方式二
from threading import Thread
import timeclass MyThead(Thread):def __init__(self,name):#重写别人的方法super().__init__()self.name = namedef run(self):print(F'{self.name} is running')time.sleep(1)print(F'{self.name} is stoppings')print('tzh666')
if __name__ == '__main__':t = MyThead('tzh')t.start()
四、线程对象的join方法
from threading import Thread
import timedef task(name):print('%s is running'%name)time.sleep(3)print('%s is over'%name)if __name__ == '__main__':t = Thread(target=task,args=('egon',))t.start()t.join() # 主线程等待子线程运行结束再执行print('主')
五、同一个进程下的多个线程数据是共享的
from threading import Thread
import timemoney = 100def task():global moneymoney = 666print(money)if __name__ == '__main__':t = Thread(target=task)t.start()t.join()print(money)
六、线程对象属性及其他方法
from threading import Thread, active_count, current_thread
import os, timedef task():print(F'子进程号是:{os.getpid()}')print(F'子线程名字是:{current_thread().name}')time.sleep(2)if __name__ == '__main__':t = Thread(target=task)t.start()#打印出来是一样的,因为他们在同一个下进程中print(F'主进程号是:{os.getpid()}')print(F'主线程名字是:{current_thread().name}')print(F'活跃的线程数:{active_count()}')
七、守护线程
- 主线程运行结束之后不会立刻结束 会等待所有其他非守护线程结束才会结束
- 因为主线程的结束意味着所在的进程的结束。如果大家对Python感兴趣的话,可以加一下我们的学习交流抠抠群哦:649825285,免费领取一套学习资料和视频课程哟~
from threading import Thread
import timedef task(name):print('%s is running'%name)time.sleep(1)print('%s is over'%name)if __name__ == '__main__':t = Thread(target=task, args=('tzh', ))t.daemon = Truet.start()print('主')
from threading import Thread
import timedef foo():print(123)time.sleep(1)print('end123')def func():print(456)time.sleep(3)print('end456')if __name__ == '__main__':t1 = Thread(target=foo)t2 = Thread(target=func)t1.daemon = Truet1.start()t2.start()print('主.......')--输出--
123
456
主.......
end123
end456
八、线程互斥锁
from threading import Thread, Lock
import timemoney = 100
mutex = Lock()def task():global money#上锁mutex.acquire()tmp = moneytime.sleep(0.1)money = tmp - 1#用完之后释放mutex.release()if __name__ == '__main__':t_list = []for i in range(100):t = Thread(target=task)t.start()t_list.append(t)for t in t_list:t.join()print(money)
python之线程,不得不了解的硬知识!相关推荐
- 搞事情 -- python之线程
简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Threading.Thread类 ...
- Python 之 线程
进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行 ...
- Python:线程之定位与销毁
背景 开工前我就觉得有什么不太对劲,感觉要背锅.这可不,上班第三天就捅锅了. 我们有个了不起的后台程序,可以动态加载模块,并以线程方式运行,通过这种形式实现插件的功能.而模块更新时候,后台程序自身不会 ...
- Python实现线程池
Python实现线程池 最近在做一些文本处理方面的事情,考虑到程序利用并发性可以提高执行效率(不纠结特殊反例),于是入围的Idea如使用多进程或多线程达到期望的目标,对于进程或线程的创建是有代价的,那 ...
- Python基础---线程
调用方式 python的线程调用有两种方式.一种是直接调用,一种是继承式调用 直接调用 import threading,time#方法一 def run(n):print(n)time.sleep( ...
- Python 守护线程
Python 守护线程 如果你设置一个线程为守护线程,,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出. 如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程 ...
- 孤荷凌寒自学python第三十八天初识python的线程控制
孤荷凌寒自学python第三十八天初识python的线程控制 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.线程 在操作系统中存在着很多的可执行的应用程序,每个应用程序启动后,就可以看着 ...
- python关闭线程根据id_python之线程相关操作
1.线程: 一个进程可以有多个线程,共享一个进程的资源: 2.进程线程的区别: 进程是资源分配的最小单位,线程是程序执行的最小单位 3.python中线程模块threading, 提供的类: Thre ...
- 用Python爬网页需要了解什么背景知识
在知乎上有一位同学提出的问题:用Python爬网页需要了解什么背景知识,恰好我对爬虫有所了解,所以昨天晚上做了回答,今天放到公众号上面希望对大家有所帮助,如有帮助欢迎转发. 文中涉及到一些教程链接在本 ...
最新文章
- mysql 远程_MYSQL开启远程访问权限的方法
- Redis - RedisTemplate及4种序列化方式深入解读
- 阿里云上创建个人网站
- dataset的去重计数 g2_向工程渣土运输车辆计数 漏洞损失说“不”
- 【NOIP模拟题】Incr(dp)
- [NOIP2012提高组] CODEVS 1200 同余方程(扩展欧几里德算法)
- Android彻底组件化方案实践
- 计算机电路板工作原理,PCB电路板测试仪的组成及测试原理.
- MapReduce的map流程
- 22考研计算机专业课——操作系统【❤️考研复习指导❤️】
- Python 正则表达式模块详解
- Lucene2.4.0一般查询结果过滤与排行
- 基于CentOS虚拟机的Hadoop安装教程(自用备忘)
- 制作粉色少女系列❤生日快乐祝福网页❤(HTML+CSS+JS)
- 【DJ-ZBS2 DH-70L两档切换漏电继电器】
- hsqldb mysql_启动hsqldb数据库
- ubuntu网页邮箱服务器设置,ubuntu配置邮件服务器
- 分享5个高质无损音乐网站,歌曲很丰富,爱听歌的小伙伴有耳福了
- 渗透火狐浏览器设置代理
- git push遇到failed to push some refs to 问题解决