一、什么是线程

  • 进程:资源单位

  • 线程:执行单位

  • 进程:资源单位(起一个进程仅仅只是在内存空间中开辟一块独立的空间)

  • 线程:执行单位(真正被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之线程,不得不了解的硬知识!相关推荐

  1. 搞事情 -- python之线程

    简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Threading.Thread类 ...

  2. Python 之 线程

    进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行 ...

  3. Python:线程之定位与销毁

    背景 开工前我就觉得有什么不太对劲,感觉要背锅.这可不,上班第三天就捅锅了. 我们有个了不起的后台程序,可以动态加载模块,并以线程方式运行,通过这种形式实现插件的功能.而模块更新时候,后台程序自身不会 ...

  4. Python实现线程池

    Python实现线程池 最近在做一些文本处理方面的事情,考虑到程序利用并发性可以提高执行效率(不纠结特殊反例),于是入围的Idea如使用多进程或多线程达到期望的目标,对于进程或线程的创建是有代价的,那 ...

  5. Python基础---线程

    调用方式 python的线程调用有两种方式.一种是直接调用,一种是继承式调用 直接调用 import threading,time#方法一 def run(n):print(n)time.sleep( ...

  6. Python 守护线程

    Python 守护线程 如果你设置一个线程为守护线程,,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出.  如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程 ...

  7. 孤荷凌寒自学python第三十八天初识python的线程控制

    孤荷凌寒自学python第三十八天初识python的线程控制 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.线程 在操作系统中存在着很多的可执行的应用程序,每个应用程序启动后,就可以看着 ...

  8. python关闭线程根据id_python之线程相关操作

    1.线程: 一个进程可以有多个线程,共享一个进程的资源: 2.进程线程的区别: 进程是资源分配的最小单位,线程是程序执行的最小单位 3.python中线程模块threading, 提供的类: Thre ...

  9. 用Python爬网页需要了解什么背景知识

    在知乎上有一位同学提出的问题:用Python爬网页需要了解什么背景知识,恰好我对爬虫有所了解,所以昨天晚上做了回答,今天放到公众号上面希望对大家有所帮助,如有帮助欢迎转发. 文中涉及到一些教程链接在本 ...

最新文章

  1. mysql 远程_MYSQL开启远程访问权限的方法
  2. Redis - RedisTemplate及4种序列化方式深入解读
  3. 阿里云上创建个人网站
  4. dataset的去重计数 g2_向工程渣土运输车辆计数 漏洞损失说“不”
  5. 【NOIP模拟题】Incr(dp)
  6. [NOIP2012提高组] CODEVS 1200 同余方程(扩展欧几里德算法)
  7. Android彻底组件化方案实践
  8. 计算机电路板工作原理,PCB电路板测试仪的组成及测试原理.
  9. MapReduce的map流程
  10. 22考研计算机专业课——操作系统【❤️考研复习指导❤️】
  11. Python 正则表达式模块详解
  12. Lucene2.4.0一般查询结果过滤与排行
  13. 基于CentOS虚拟机的Hadoop安装教程(自用备忘)
  14. 制作粉色少女系列❤生日快乐祝福网页❤(HTML+CSS+JS)
  15. 【DJ-ZBS2 DH-70L两档切换漏电继电器】
  16. hsqldb mysql_启动hsqldb数据库
  17. ubuntu网页邮箱服务器设置,ubuntu配置邮件服务器
  18. 分享5个高质无损音乐网站,歌曲很丰富,爱听歌的小伙伴有耳福了
  19. 渗透火狐浏览器设置代理
  20. git push遇到failed to push some refs to 问题解决

热门文章

  1. 机器学习笔记(五)——朴素贝叶斯分类
  2. python3 携程_多任务(3):协程
  3. 作者:陈钧,男,中国国防科技信息中心高级工程师、研究室主任。
  4. 【Java】Maven工程目录下ImageIcon读图片失败爆空指针的解决方案
  5. 【面向对象】面向对象程序设计测试题7-对象之间的has-a/many关系测试题
  6. 【Java】基于栈的括号匹配问题
  7. 【数理逻辑四】谓词逻辑及形式系统 【下】
  8. React Suspense提供Redux的替代方案
  9. Java编译器优化与运行期优化技术浅析
  10. 为什么重写equals时必须重写hashCode方法?