当前位置: 首页 > news >正文

进程与线程学习

多线程

t=threading.Thread(target=task,arge=(11,))
start()开始
join()等待

主线程在默认情况下会等待所有非守护线程(子线程)结束后才会结束程序。也就是说,如果主线程在结束前没有调用所有子线程的 join() 方法,主线程将继续执行,并且当主线程完成它的执行后,它将等待所有子线程结束。

多线程对同一个变量操作时可能造成数据竞争

import threading
loop=1000000
number=0
def _add(count):global numberfor i in range(count):number+=1
def _sub(count):global numberfor i in range(count):number-=1
t1=threading.Thread(target=_add,args=(loop,))
t2=threading.Thread(target=_sub,args=(loop,))
t1.start()
t2.start()
t1.join()
#t2.join()
print(number)

未调用 t2.join() 会导致在 t1 线程结束后,主线程打印 number 的值,然后程序依然会等 t2 线程结束。但由于打印 number 的操作在 t2 结束前可能被执行,这会导致 number 的值不确定。

解决方案:
加锁
import threading
loop=1000000
number=0
lock_object=threading.RLock()
def _add(count):lock_object.acquire() #申请锁global numberfor i in range(count):number+=1lock_object.release() # 释放锁
def _sub(count):lock_object.acquire()global numberfor i in range(count):number-=1lock_object.release()
# 也可以这么写
def sub():with lock_object:  #自动进行申请和释放global numberfor i in range(count):number-=1
t1=threading.Thread(target=_add,args=(loop,))
t2=threading.Thread(target=_sub,args=(loop,))
t1.start()
t2.start()
t1.join()
t2.join()
print(number)
Lock(同步锁)和 RLock(递归锁)区别

Lock效率更高,但是不支持多次锁的情况,一般项目开发还是用RLock

import threading
lock_object=threading.RLock()# personA create a function
def fun():with lock_object:pass
# personB,too and use A' fun()
def run():print("other use")fun()print("other use")
# personC create functions,need lock,use fun
def progress():with lock_object:print('other use')fun()print('hhhhh')
死锁
竞争资源
import threading
lock=threading.RLock()
num=0
def task():print('start')lock.acquire()lock.acquire()global numfor i in range(100000):num+=ilock.release()lock.release()print(num)
for i in range(2):t=threading.Thread(target=task)t.start()
# start
# 4999950000
# start
# 9999900000
彼此通信
import threading
import time
lock_1=threading.RLock()
lock_2=threading.RLock()
def task1():lock_1.acquire()time.sleep(1)lock_2.acquire()print(11)lock_2.release()print(1111)lock_1.release()print(111111)
def task2():lock_2.acquire()time.sleep(1)lock_1.acquire()print(22)lock_1.release()print(2222)lock_2.release()print(222222)
t1=threading.Thread(target=task1)
t1.start()
t2=threading.Thread(target=task2)
t2.start()

t.daemon=true  设置守护线程

name=threading.current_thread().getName() 获取当前线程名称

t.setName('xxx') 设置线程名称,要在 start()之前

线程池

相关文章:

  • 回文链表(快慢指针解法之在推进过程中反转)
  • 《当微服务遇上Ribbon:一场负载均衡的华丽舞会》
  • Android Studio 所有历史版本下载
  • P1160 队列安排
  • Excel插入多行VBA实现
  • 【Real】[Flask]SSTI
  • 2024年,企业人才招聘怎么做?
  • B站pink老师HTML5基础(一)
  • SAP OBYC自动记账 详解
  • LangChain笔记
  • makefile一些特殊且常用的符号
  • 哈希算法教程(个人总结版)
  • 查询DQL
  • 赶紧收藏!2024 年最常见 20道 Rocket MQ面试题(二)
  • 基于python flask +pyecharts实现的气象数据可视化分析大屏
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【前端学习】-粗谈选择器
  • 11111111
  • 2017届校招提前批面试回顾
  • 3.7、@ResponseBody 和 @RestController
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • js对象的深浅拷贝
  • js面向对象
  • PHP 小技巧
  • Python - 闭包Closure
  • spring boot下thymeleaf全局静态变量配置
  • SQLServer之索引简介
  • Travix是如何部署应用程序到Kubernetes上的
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Vue小说阅读器(仿追书神器)
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 前端存储 - localStorage
  • 强力优化Rancher k8s中国区的使用体验
  • 树莓派 - 使用须知
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • ${ }的特别功能
  • (007)XHTML文档之标题——h1~h6
  • (04)odoo视图操作
  • (19)夹钳(用于送货)
  • (7)STL算法之交换赋值
  • (Git) gitignore基础使用
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (三) diretfbrc详解
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (十三)Flask之特殊装饰器详解