进程与线程学习

devtools/2024/12/23 6:31:51/

多线程

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()之前

线程池


http://www.ppmy.cn/devtools/44578.html

相关文章

Ai速递5.29

全球AI新闻速递 1.摩尔线程与无问芯穹合作,实现国产 GPU 端到端 AI 大模型实训。 2.宝马工厂:机器狗上岗,可“嗅探”故障隐患。 3.ChatGPT:macOS 开始公测。 4.Stability AI:推出Stable Assistant,可用S…

js 面试题学习笔记一

1、什么是防抖和节流?有什么区别?如何实现? 防抖:触发高频事件后N秒内函数只会执行一次,如果N秒高频事件再次被触发,则重新计算时间。(a时间触发,5秒内执行一次,但是第4…

基于51单片机的温湿度控制系统

一.硬件方案 本设计采用51单片机每2秒钟从DHT11温湿度传感器中读入温度和湿度,在液晶屏上即时显示。液晶屏上同时显示温湿度上限值,该上限值保存外外部EEPROM存储器中,掉电不失,并且可以通过四只按键上调或下调。当温度或湿度值超…

Android Ktor 网络请求框架

Ktor 是一个由 JetBrains 开发的用于 Kotlin 编程语言的应用框架,旨在创建高性能的异步服务器和客户端应用程序。由于完全基于 Kotlin 语言,Ktor 能够让开发者编写出简洁、可读性强且功能强大的代码,特别适合那些已经熟悉 Kotlin 的开发人员。…

Flutter 中的 Opacity 小部件:全面指南

Flutter 中的 Opacity 小部件:全面指南 在Flutter中,动画和视觉效果是提升用户体验的重要手段。Opacity小部件允许你改变子组件的透明度,从而实现淡入、淡出或其它透明度相关的动画效果。本文将提供Opacity的全面指南,帮助你了解…

数据库到服务器提权

数据库提权流程: 1、先获取到数据库用户密码 -网站存在SQL注入漏洞 -数据库的存储文件或备份文件 -网站应用源码中的数据库配置文件 -采用工具或脚本爆破(需解决外联问题) 2、利用数据库提权项目进行连接 MDUT //jkd1.8 启动 Databasetools …

Wpf 使用 Prism 实战开发Day28

首页汇总方块点击导航功能 点击首页汇总方块的时候,跳转到对应的数据页面 step1: 在IndexViewModel 中,给TaskBar 里面Target 属性,赋上要跳转的页面 step2: 创建导航事件命令和方法实现 step3: 实现导航的逻辑。通过取到 IRegionManager 的…

c++常用设计模式

1、单例模式(Singleton):保证一个类只有一个实例,提供一个全局访问点; class Singleton { private:static Singleton* instance;Singleton() {}public:static Singleton* getInstance() {if (instance nullptr) {instance new Singleton()…