pyyhon_day35

目录

Manager ( list 列表  ,  dict 字典 ) 进程之间共享数据

线程

用类定义线程

守护线程 : 等待所有线程全部执行完毕之后,自己在终止程序,守护所有线程

线程中的数据安全问题

信号量 Semaphore (线程)

互斥锁 死锁 递归锁

事件


Manager ( list 列表  ,  dict 字典 ) 进程之间共享数据

from multiprocessing import Process , Manager ,Lock

def mywork(data,lock):
	# 共享字典
	"""
	lock.acquire()
	data["count"] -= 10
	lock.release()
	"""
	
	# 共享列表
	data[0] += 1
	
	
if __name__ == "__main__":
	lst = []
	m = Manager()
	lock = Lock()
	# 多进程中的共享字典
	# data = m.dict(  {"count":5000}  )
	# print(data , type(data) )
	# 多进程中的共享列表
	data =  m.list( [100,200,300] )
	# print(data , type(data) )
	""""""
	# 进程数超过1000,处理该数据,死机(谨慎操作)
	for i in range(1000):
		p = Process(target=mywork,args=(data,lock))
		p.start()
		lst.append(p)
		
	# 必须等待子进程所有计算完毕之后,再去打印该字典,否则报错;
	for i in lst:
		i.join()
		
	print(data)

线程

# ### 线程 
"""
进程是资源分配的最小单元
线程是cpu执行调度的最小单元
"""

# (1) 一个进程里包含了多个线程,线程之间是异步并发
from threading import Thread
from multiprocessing import Process
import os , time , random

"""
def func(i):
	time.sleep(random.uniform(0.1,0.9))
	print("当前进程号:{}".format(os.getpid()) , i)
	
if __name__ == "__main__":
	for i in range(10):
		t = Thread(target=func,args=(i,))
		t.start()
		
print(os.getpid())
"""

# (2) 并发的多进程和多线程之间,多线程的速度更快
# 多线程速度
def func(i):
	print( "当前进程号:{} , 参数是{} ".format(os.getpid() , i)  )

"""
if __name__ == "__main__":
	lst = []
	startime = time.time()
	for i in range(10000):
		t = Thread(target=func,args=(i,))
		t.start()
		lst.append(t)
	# print(lst)
	for i in lst:
		i.join()
	endtime = time.time()
	print("运行的时间是{}".format(endtime - startime) ) # 运行的时间是1.8805944919586182
"""
# 多进程速度
"""
if __name__ == "__main__":
	lst = []
	startime = time.time()
	for i in range(10000):
		p = Process(target=func,args=(i,))
		p.start()
		lst.append(p)
	# print(lst)
	for i in lst:
		i.join()
	endtime = time.time()
	print("运行的时间是{}".format(endtime - startime) ) # 运行的时间是101.68004035949707
"""


# (3) 多线程之间,数据共享
num = 100
lst = []
def func():
	global num
	num -= 1

for i in range(100):
	t = Thread(target=func)
	t.start()
	lst.append(t)
	
for i in lst:
	i.join()
	
print(num)

用类定义线程

from threading import Thread
import os,time

# (1)必须继承父类Thread,来自定义线程类
"""
class MyThread(Thread):

	def __init__(self,name):
		# 手动调用父类的构造方法
		super().__init__()
		# 自定义当前类需要传递的参数
		self.name = name

	def run(self):
		print(  "当前进程号{},name={}".format(os.getpid() , self.name)  )

if __name__ == "__main__":
	t = MyThread("我是线程")
	t.start()
	print( "当前进程号{}".format(os.getpid()) )
"""

# ### 线程中的相关属性
"""
# 线程.is_alive()    检测线程是否仍然存在
# 线程.setName()     设置线程名字
# 线程.getName()     获取线程名字
# 1.currentThread().ident 查看线程id号 
# 2.enumerate()        返回目前正在运行的线程列表
# 3.activeCount()      返回目前正在运行的线程数量
"""
"""
def func():
	time.sleep(1)
if __name__ == "__main__":
	t = Thread(target=func)
	t.start()
	# 检测线程是否仍然存在
	print( t.is_alive() )
	# 线程.getName()     获取线程名字
	print(t.getName())
	# 设置线程名字
	t.setName("抓API接口")
	print(t.getName())
"""


from threading import currentThread
from threading import enumerate
from threading import activeCount
def func():
	time.sleep(0.1)
	print("当前子线程号id是{},进程号{}".format( currentThread().ident ,os.getpid()) )

if __name__ == "__main__":
	t = Thread(target=func)
	t.start()
	print("当前主线程号id是{},进程号{}".format( currentThread().ident ,os.getpid()) )

	
	for i in range(5):
		t = Thread(target=func)
		t.start()
	# 返回目前正在运行的线程列表
	lst = enumerate()
	print(lst,len(lst))
	# 返回目前正在运行的线程数量 (了解)
	print(activeCount())

守护线程 : 等待所有线程全部执行完毕之后,自己在终止程序,守护所有线程

from threading import Thread
import time
def func1():
	while True:
		time.sleep(1)		
		print("我是函数func1")
		
def func2():
	print("我是func2  start ... ")
	time.sleep(3)
	print("我是func2  end ... ")
	
def func3():
	print("我是func3 start ... ")
	time.sleep(6)	
	print("我是func3  end ... ")
	
	
if __name__ == "__main__":
	t = Thread(target=func1)
	t2 = Thread(target=func2)
	t3 = Thread(target=func3)
	
	# 设置守护线程 (启动前设置)
	t.setDaemon(True)
	
	t.start()
	t2.start()
	t3.start()
	
	print("主线程执行结束.... ")

线程中的数据安全问题

from threading import  Thread  , Lock
import time

n = 0

def func1(lock):
	global n
	
	lock.acquire() 
	for i in range(1000000):		
		n += 1
	lock.release()

def func2(lock):
	global n
	# with语法可以简化上锁+解锁的操作,自动完成
	with lock:
		for i in range(1000000):
			n -= 1

		
if __name__ == "__main__":
	lst = []
	lock = Lock()
	
	start = time.time()
	for i in range(10):
		t1 = Thread(target=func1 ,args=(lock,) )
		t1.start()
		
		t2 = Thread(target=func2 ,args=(lock,) )
		t2.start()
		
		lst.append(t1)
		lst.append(t2)

	for i in lst:
		i.join()
	# print(lst,len(lst))
	end = time.time()
	print("主线程执行结束... 当前n结果为{} ,用时{}".format(n , end-start))

信号量 Semaphore (线程)

"""同一时间对多个线程上多把锁"""
from threading import Thread,Semaphore
import time , random

def func(i,sem):
	time.sleep(random.uniform(0.1,0.7))
	# with语法自动实现上锁 + 解锁
	with sem:		
		print("我在电影院拉屎 .... 我是{}号".format(i))
		

if __name__ == "__main__":
	sem = Semaphore(5)
	for i in range(30):
		Thread(target=func,args=(i,sem)).start()
	print(1)
"""
	创建线程是异步的,
	上锁的过程会导致程序变成同步;
"""		

互斥锁 死锁 递归锁

事件

# ### 事件 Event
from threading import Thread , Event
import time,random
"""
wait   : 动态加阻塞 (True => 放行  False => 阻塞)
is_set : 获取内部成员属性值是True 还是 False
set    : 把False -> True
clear  : 把True  -> False
"""
# (1) 基本语法
"""
e = Event()
print(e.is_set())
e.set()
print(e.is_set())
e.wait()
e.clear()
# 最多阻塞三秒,放行
e.wait(3)
print("代码执行中 ... ")
"""

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/555412.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

邮箱群组是什么?怎么创建邮箱群组?

在我们群发邮件时,可能会遇到这样的状况,一个个输入邮箱地址效率很低,而且很容易就漏发。而对于一个企业来说,如果出现这样的问题,很有可能会影响公司的业务进展和团队协作。这个时候我们就需要邮箱群组这个功能&#…

移远通信:立足5G RedCap新质生产力,全力推动智能电网创新发展

随着全球能源结构的转型和电力需求的持续增长,智能电网产业迎来了新的发展机遇。而物联网、大数据等前沿技术的创新和应用,正在为电力行业的发展注入强劲的新质生产力。 4月9日,第四十八届中国电工仪器仪表产业发展技术研讨及展会在杭州拉开帷…

使用自己训练好的模型YOLOv8进行X-AnyLabeling自动标注

目录 1. 下载项目2. 创建环境3. 运行程序3.1 自行下载和添加官方模型3.2 使用自己训练好的模型标注自己的数据集 本机环境:win 10, GPU 1. 下载项目 git clone https://github.com/CVHub520/X-AnyLabeling.git2. 创建环境 仔细查看项目的README文件 …

电脑技巧:如何把Edge浏览器扩展程序打包安装到其他浏览器

目录 1、进入浏览器扩展界面 2、找到Edge浏览器扩展插件的路径 3、找到需要扩展的插件ID 4、打开浏览器扩展插件目录 5、进入打包扩展界面 6、 安装到其他浏览器 大家日常使用浏览器的时候通常会安装很多浏览器插件,从而大大提升我们的办公效率,有…

CTF中常见的四种python逆向

说在前面: 什么是pyc文件? pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高, pyc 文件是 Python 编译过的字节码文…

文件IO基础

一、文件描述符 调用 open 函数会有一个返回值,该返回值就是一个文件描述符( file descriptor),这说明文件描述符是一个 非负整数;对于 Linux 内核而言,所有打开的文件都会通过文件描述符进行索引。 当调用…

2024年第十六届“华中杯”(B题)大学生数学建模挑战赛| 时间序列,滑动窗口 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 让我们来看看华中杯 (B题)! CS团队倾…

《四月女友》定档5月18日 佐藤健、长泽雅美演绎唯美爱情

由川村元气担任编剧,山田智和导演,佐藤健、长泽雅美、森七菜主演的唯美爱情电影《四月女友》今日正式宣布定档5月18日,并发布了“相恋”版预告和“相拥”版海报。预告中,优美宁静的风景令人心生向往,藤代俊&#xff08…

【深度学习实战(8)】如何绘制loss曲线图

一、步骤 我们先定义一个dict,每一个key对应的value都是一个list。 loss_history dict((k, []) for k in ["epoch", "train_loss", "val_loss"])每一轮或者每一次迭代的损失都通过list记录下来。 loss_history["epoch"…

改手机IP地址的软件推荐

随着移动互联网的普及,手机已成为人们日常生活中不可或缺的一部分。而在使用手机的过程中,IP地址作为一个重要的网络标识,有时也需要进行修改或更改。为了满足这一需求,市面上涌现出了许多改手机IP地址的软件。虎观代理将对这些软…

2024年腾讯云服务器价格一览表

随着云计算技术的快速发展,越来越多的企业和个人开始选择使用云服务器来满足他们的数据存储和计算需求。腾讯云作为国内领先的云服务提供商,其服务器产品因性能稳定、安全可靠而备受用户青睐。那么,2024年腾讯云服务器的价格情况如何呢&#…

Flattened Butterfly 扁平蝶形拓扑

Flattened Butterfly 扁平蝶形拓扑 1. 传统蝶形网络 Butterfly Topology2. 扁平蝶形拓扑 Flattened Butterfly3.On-Chip Flattened Butterfly 扁平蝶形拓扑应用于片上网络 Flattened Butterfly 扁平蝶形拓扑 扁平蝶形拓扑是一种经济高效的拓扑,适用于高基数路由器…

复合升降机器人教学科研平台——技术方案

一:功能概述 1.1 功能简介 复合升降机器人是一款集成移动底盘、机械臂、末端执行器、边缘计算平台等机构形成的教学科研平台,可实现机器人建图导航、路径规划,机械臂运动学、动力学、轨迹规划、视觉识别等算法功能和应用,提供例如…

前后端交互实例(javaweb05)

文章开始前,先给大家看一张图,这是黑马javaweb-day05请求响应实例,也是第一个实现了前后端交互,这是我画的流程图,搞懂了前后端是如何交互的.(文件的所有路径不能出现中文,否则会报错,这个我暂时不知道该怎么解决). 那么这里面涉及到的东西,除了emp.html这是已经提供了的前端页…

C++:深入理解operator new/operator delete

动态内存管理 1.语法层面1.基本语法注意点 2.new/delete和malloc/free的区别3.operator new和operator delete函数(底层重点)1.operator new/delete原理2.图解1.new/new[]2.delete/delete[] 3.new[n]和delete[] 4.定位new1.定义2.使用格式 1.语法层面 1…

【前端面试3+1】13 JS特性、JS是单线程还是多线程、JS中的一部和同步、【合并两个有序数组】

一、JavaScript特性 弱类型:JavaScript是一种弱类型语言,变量的类型可以动态改变,不需要事先声明类型。动态性:JavaScript是一种动态语言,可以在运行时修改对象的结构和属性。基于原型的:JavaScript是一种基…

WdatePicker异常,无法弹出日期选择框

官网:My97日期控件官方网站 My97 DatePickerhttp://www.my97.net/ 可能使版本太老了,可以更新一下,然后根据官方的文件进行使用。 我的异常是因为在网上找的包里面缺少文件,去官网拉了一下最新的就行了。

状态压缩DP题单

P1433 吃奶酪&#xff08;最短路&#xff09; dp(i, s) 表示从 i 出发经过的点的记录为 s 的路线距离最小值 #include<bits/stdc.h> #define int long long using namespace std; const int N 20; signed main() { int n; cin >> n;vector<double>x(n 1),…

FreeRTOS之动态创建任务与删除任务

1.本文是利用FreeRTOS来动态创建任务和删除任务。主要是使用FreeRTOS的两个API函数&#xff1a;xTaskCreate()和vTaskDelete()。 任务1和任务2是让LED0、LED1闪烁。任务3是当按键按下时删除任务1。 使用动态创建任务时&#xff0c;需要动态的堆中申请任务所需的内存空间&…

OpenHarmony多媒体-ohos_videocompressor

介绍 videoCompressor是一款ohos高性能视频压缩器。 目前实现的能力&#xff1a; 支持视频压缩 使用本工程 有两种方式可以下载本工程&#xff1a; 开发者如果想要使用本工程,可以使用git命令 git clone https://gitee.com/openharmony-sig/ohos_videocompressor.git --…
最新文章