pyyhon_day35

2024-04-19 02:36
文章标签 day35 pyyhon

本文主要是介绍pyyhon_day35,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

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

线程

用类定义线程

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

线程中的数据安全问题

信号量 Semaphore (线程)

互斥锁 死锁 递归锁

事件


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

from multiprocessing import Process , Manager ,Lockdef mywork(data,lock):# 共享字典"""lock.acquire()data["count"] -= 10lock.release()"""# 共享列表data[0] += 1if __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 numnum -= 1for 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 = namedef 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 timen = 0def func1(lock):global nlock.acquire() for i in range(1000000):		n += 1lock.release()def func2(lock):global n# with语法可以简化上锁+解锁的操作,自动完成with lock:for i in range(1000000):n -= 1if __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 , randomdef 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("代码执行中 ... ")
"""

这篇关于pyyhon_day35的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/916431

相关文章

【JAVA入门】Day35 - 方法引用

【JAVA入门】Day35 - 方法引用 文章目录 【JAVA入门】Day35 - 方法引用一、方法引用的分类1.引用静态方法2.引用成员方法2.1 引用其他类的成员方法2.2 引用本类和父类的成员方法2.3 引用构造方法2.4 使用类名引用成员方法2.5 引用数组的构造方法 二、方法引用的例题         方法引用就是“把已经有的方法当作函数式接口中抽象方法的方法

Java高级Day35-Properties

102.Properties类 public class Properties01 {public static void main(String[] args) throws IOException{\//读取mysql.properties 文件,并得到ip,user 和 pwdBufferedReader br = new BufferedReader(new FileReader("sr

day35 | | 01背包问题 二维 01背包问题 一维(二刷) 416. 分割等和子集

代码随想录算法训练营第 35 天| 01背包问题 二维 01背包问题 一维(二刷) 416. 分割等和子集 Leetcode 01背包问题 二维 题目描述: 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 思路: 动态规划 代码: import jav

日撸Java三百行(day35:图的m着色问题)

目录 一、问题描述 二、思路分析 三、代码实现 总结 一、问题描述 在高中学习排列组合的时候,有一个非常经典的问题,就是涂色问题,即用m种颜色给n块区域涂色,要求每块区域只能涂同一种颜色且相邻区域的颜色不能相同,问一共有多少种涂色方案。还记得当时自己是怎么做的吗?下面我们就用一个具体的例子来回顾一下。 如下图,共有A、B、C、D四块区域,用五种颜色给它们涂色,要求每块区域只能

前端学习Day35

Day35:P168-P76 学习笔记: 1.静态方法就是只有构造函数Object可以调用的 2.array: forEach:遍历数组 不返回数组,经常用于查找遍历数组元素 filter:过滤数组 返回新数组,返回的是筛选满足条件的数组元素 map:迭代数组 返回新数组,返回的是处理之后的数组元素,想要使用返回的新数组 reduce:累计器 返回累计处理的结果,经常用于求和

Day31 - Day35

Day31 - Day35 Day31(1999年text5) Science, in practice, depends far less on the experiments it prepares than on the preparedness of the minds of the men who watch the experiments. 在实践中,科学对实验的依赖远少

day35| 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

文章目录 前言860.柠檬水找零思路方法一 406.根据身高重建队列思路方法一 452. 用最少数量的箭引爆气球思路方法一 总结 前言 860.柠檬水找零 思路 很简单,贪心只有一个,如果20优先用10+5找零,因为5更加万能一些 方法一 class Solution(object):def lemonadeChange(self, bills):""":type

day35贪心算法part03| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

1005.K次取反后最大化的数组和 本题简单一些,估计大家不用想着贪心 ,用自己直觉也会有思路。 题目讲解 | 题目链接 自己的想法,也通过了 class Solution {public:int sumMax(vector<int>& nums) {int sum = 0;for (int i = 0; i < nums.size(); i++) {cout << nums[i] <

【前端每日基础】day35——HTML5离线存储

HTML5引入了一些新的特性和API来增强Web应用的功能,其中之一就是离线存储。离线存储允许Web应用在没有网络连接的情况下仍能正常运行。以下是HTML5离线存储的主要技术和详细介绍: Web Storage (LocalStorage 和 SessionStorage) LocalStorage 概述:LocalStorage用于持久化存储数据,数据不会随页面会话结束而消失,除非明确删除。

C++笔试强训day35

目录 1.奇数位丢弃 2.求和 3.计算字符串的编辑距离 1.奇数位丢弃 链接https://www.nowcoder.com/practice/196141ecd6eb401da3111748d30e9141?tpId=128&tqId=33775&ru=/exam/oj 数据量不大,可以直接进行模拟: #include <iostream>#include <v