day31 线程

 

01 进程间通信

 

"""
队列:先进先出
堆栈:先进后出
"""
from multiprocessing import Queue
q = Queue(5)  # 括号内可以传参数 表示的是这个队列的最大存储数
# 往队列中添加数据
q.put(1)
q.put(2)
print(q.full())  # 判断队列是否满了
q.put(3)
q.put(4)
q.put(5)
print(q.full())
# q.put(6)  # 当队列满了之后 再放入数据 不会报错 会原地等待 直到队列中有数据被取走(阻塞态)print(q.get())
print(q.get())
print(q.get())
print(q.empty())  # 判断队列中的数据是否取完
print(q.get())
print(q.get())
print(q.empty())
print(q.get_nowait())  # 取值 没有值不等待直接报错
# print(q.get())  # 当队列中的数据被取完之后 再次获取 程序会阻塞 直到有人往队列中放入值
"""
full
get_nowait
empty
都不适用于多进程的情况
"""

 

02 进程间通信IPC机制

from multiprocessing import Queue, Processdef produce(q):q.put('hello,baby~')def consumer(q):print(q.get())if __name__ == '__main__':q = Queue()p = Process(target=produce, args=(q,))  # target(把...作为目标)c = Process(target=consumer, args=(q,))p.start()c.start()

 

03 生产者消费者模型

"""
生产者:生产/制造数据的
消费者:消费/处理数据的
例子:做包子的,买包子的1.做包子远比买包子的多2.做包子的远比包子的少供需不平衡的问题
"""# # multiprocessing:多重处理from multiprocessing import Process, Queue, JoinableQueue
import time
import randomdef producer(name, food, q):for i in range(1, 10):data = f"{name}做了第{i}份{food}"time.sleep(random.random())  # 随机睡1秒之内
        q.put(data)print(data)def consumer(name, q):while True:data = q.get()if data == None: breakprint(f"{name}吃了{data}")time.sleep(random.random())q.task_done()if __name__ == '__main__':q = JoinableQueue()p1 = Process(target=producer, args=('jason', '馒头', q))p2 = Process(target=producer, args=('tank', '生蚝', q))c1 = Process(target=consumer, args=('ryan', q))c2 = Process(target=consumer, args=('ami', q))p1.start()p2.start()c1.daemon = Truec2.daemon = Truec1.start()c2.start()p1.join()p2.join()q.join()  # 等队列中数据全部取出

 

04 线程

什么是线程进程线程其实都是虚拟单位,都是用来帮助我们形象的描述某种事物进程:资源单位线程:执行单位将内存比如成工厂那么进程就相当于是工厂里面的车间而你的线程就相当于是车间里面的流水线ps:每个进程都自带一个线程,线程才是真正的执行单位,进程只是在线程运行过程中提供代码运行所需要的资源为什么要有线程开进程1.申请内存空间  耗资源2."拷贝代码"    耗资源开线程一个进程内可以起多个线程,并且线程与线程之间数据是共享的ps:开启线程的开销要远远小于开启进程的开销如何使用线程

 

05 创建线程的两种方式

import time
from threading import Threaddef run(name):print(f"{name} is running.")time.sleep(2)print(f"{name} is stop.")t = Thread(target=run, args=('ryan',))  # TypeError: run() takes 1 positional argument but 4 were given
t.start()


import time from threading import Threadclass MyThread(Thread):def __init__(self, name):super().__init__()self.name = namedef run(self):print(f"{self.name} is running.")time.sleep(2)print(f"{self.name} is over.")t = MyThread('ryan') t.start() print('')

 

06 线程对象及其他方法

# 查看线程的活跃数
import os
import time
from threading import Thread, active_count, current_threaddef task(name, i):print(f"{name} is running")print("主current_thread", current_thread().name)print(os.getpid())time.sleep(i)print(f"{name} is over")t1 = Thread(target=task, args=('ryan', 1))
t2 = Thread(target=task, args=('ryan', 2))
t1.start()
t2.start()
t2.join()
print("当前活跃线程数", active_count())
print('')
print("主current_thread", current_thread().name)
print(os.getpid())

 

07 守护线程

import time
from threading import Thread,current_threaddef task(i):print(current_thread().name)time.sleep(i)t = Thread(target=task, args=(1,))t.daemon = True
t.start()
print('')

 

08 线程间通信

from threading import Threadmoney = 666def task():global moneymoney = 999t = Thread(target=task)
t.start()
t.join()
print(money)

 

09 互斥锁

from threading import Thread, Lock
import timen = 100def task(mutex):global nmutex.acquire()  # 获得tmp = ntime.sleep(0.1)n = tmp - 1mutex.release()t_list = []
mutex = Lock()
for i in range(100):t = Thread(target=task, args=(mutex,))t.start()t_list.append(t)
for t in t_list:t.join()
print(n)

 

10 小例子

from threading import Thread
from multiprocessing import Process
import time
def foo():print(123)time.sleep(1)print("end123")def bar():print(456)time.sleep(3)print("end456")if __name__ == '__main__':t1=Thread(target=foo)t2=Thread(target=bar)t1.daemon=Truet1.start()t2.start()print("main-------")

 

转载于:https://www.cnblogs.com/Ryan-Yuan/p/11343434.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

06.动态SQL和foreach

动态sql: 映射文件代码: 1 <!-- 动态sql,根据名字和年龄查询,where标签会处理第一个and&#xff0c;其他位置的and不会自动处理 -->2 <select id"queryStudentByNameAndAge" parameterType"student" resultMap"student1">3 s…

机器学习理论基础到底有多可靠?

来源&#xff1a;机器学习算法与Python实战选自&#xff1a;aidancooper.co.uk 作者&#xff1a;Aidan Cooper编译&#xff1a;机器之心 知其然&#xff0c;知其所以然。机器学习领域近年的发展非常迅速&#xff0c;然而我们对机器学习理论的理解还很有限&#xff0c;有些模型…

07.MyBatis中的关联查询

关联查询&#xff1a; 一对一&#xff1a; 两种方式实现: 1.通过业务扩展的方式进行一对一查询&#xff0c;新建一个实体类&#xff0c;继承其中属性多的一个&#xff0c;然后写上另一个类中的属性&#xff1a; 实体类: 映射文件: 1 <!-- 业务扩展的方式进行一对一查询&…

黄仁勋回应放弃收购Arm:公司战略并没有太大改变

来源&#xff1a;网易智能2月21日消息&#xff0c;芯片巨头英伟达不久前公布了2022财年第四财季财报&#xff0c;显示其营收较上年同期猛增53%&#xff0c;游戏、数据中心和专业可视化市场平台也都实现了创纪录的收入。财报发布后&#xff0c;该公司首席执行官黄仁勋接受美国科…

20190423面试记录

1&#xff09;apply&#xff0c;call&#xff0c;bind的区别 &#xff1f; 应用场景&#xff1a;用于改变this的指向 apply接收两个参数&#xff0c;第一个函数this将指向的对象&#xff0c;第二个是数组函数接收的参数 call接收多个参数&#xff0c;第一个函数this将指向的对象…

无生命的AI算不上「智能」

来源&#xff1a;AI前线作者&#xff1a;Ben Dickson译者&#xff1a;王强策划&#xff1a;刘燕什么是智能&#xff1f;以非常快的速度解决复杂的数学问题就算智能吗&#xff1f;在国际象棋中击败世界冠军的力量算智能吗&#xff1f;分辨图像中数千个不同对象的能力算智能吗&am…

08.MyBatis整合Log4j

MyBatis整合Log4j&#xff1a; 1.导入log4j.jar 2.在conf.xml中开启日志文件: 1 <!-- 配置日志文件 --> 2 <settings> 3 <setting name"logImpl" value"LOG4J"/> 4 </settings> 如果不指定,MyBatis就会根据一下顺…

MySQL 练习 创建表格2

|--需求说明 #实践课&#xff0c;使用SQL语句创建成绩表#要求&#xff1a;在数据库myschool中&#xff0c;使用SQL语句创建成绩表result&#xff0c;result的结构表见书上 |--实现思路 采用创建表的语句完成 |--代码内容 #实践课&#xff0c;使用SQL语句创建成绩表 #要求&#…

前沿速递:因果涌现在多种因果衡量标准下普遍存在

来源&#xff1a; 集智俱乐部作者&#xff1a;陈昊编辑&#xff1a;邓一雪导语因果涌现理论指出&#xff0c;在宏观尺度下观察复杂系统可以减少因果关系中的噪声&#xff0c;从而得到具有更强因果关联的系统。目前该理论已经在有效信息和整合信息的因果度量标准下得到的验证&am…

JavaScript每日学习日记(2)

8.13.2019 1. 正则表达式常见字符串方法&#xff1a; search( ) , replace( ) var str "Visit Website"; var n str.search(/website /i); var str "Visit Microsoft!"; var res str.replace("Microsoft", " Website "); 2. 如果未…

类脑计算的一大突破 BrainScaleS-2

来源&#xff1a;混沌巡洋舰今天最成功的人工智能算法&#xff0c;人工神经网络&#xff0c;是基于我们大脑中错综复杂的真实神经网络。但与我们高效的大脑不同的是&#xff0c;在计算机上运行这些算法消耗了惊人的能量: 最大型的模型在训练全过程中消耗的能量几乎相当于五辆汽…

委托、Lambda表达式、事件系列07,使用EventHandler委托

谈到事件注册&#xff0c;EventHandler是最常用的。 EventHandler是一个委托&#xff0c;接收2个形参。sender是指事件的发起者&#xff0c;e代表事件参数。 □ 使用EventHandler实现猜拳游戏 使用EventHandler实现一个猜拳游戏&#xff0c;每次出拳&#xff0c;出剪刀、石头、…

2022年国家自然科学基金指南发布情况

来源&#xff1a;锐动源编辑部近日&#xff0c;2022年国家自然科学基金部分项目申报指南已陆续发布。据不完全统计&#xff0c;截至目前2022年国家自然科学基金已发布32个项目的申报指南&#xff0c;其中“国家自然科学基金委员会与日本学术振兴会合作与交流项目”已发布获资助…

最简单概率论的五个智慧

来源 &#xff1a;罗辑思维在我认为人人都应该学一些概率知识&#xff0c;它现在是公民的必备知识。现在的世界比过去复杂得多&#xff0c;其中有大量不确定性&#xff0c;是否理解概率&#xff0c;直接决定一个人的开化程度。01随机&#xff1a;有些事情是无缘无故地发生的这个…

谷歌AI一次注释了10%的已知蛋白质序列,超过人类十年研究成果

来源&#xff1a;ScienceAI编辑 &#xff1a;泽南、张倩和 AlphaFold 不同&#xff0c;这次谷歌探索的是用深度学习给蛋白质打上功能标签。蛋白质是组成人体一切细胞、组织的重要成分。机体所有重要的组成部分都需要有蛋白质的参与。目前已知存在的蛋白质种类有数十亿&#xff…

20190808面试记录

Angular的核心&#xff1f; 组件&#xff0c;指令&#xff0c;服务&#xff0c;依赖注入 性能优化&#xff1f; 1、减少http请求&#xff08;图片压缩合并&#xff0c;css压缩合并&#xff0c;js文件压缩合并&#xff09; 2、检查是否有重定向问题 3、检查是否一个列表有多次请…

你真的了解计算生物学和AI for Science吗?

来源&#xff1a;量子位Q1&#xff1a;AlphaFold2的最大意义是什么&#xff1f;A1&#xff1a;这个看似突破性的进展&#xff0c;其实是技术演进的必然结果。 此外&#xff0c;如果我们换个视角来看待这个问题&#xff0c;蛋白质结构预测仅仅是计算生物学这个大门类里面一个相对…

excel字符串反转

1.新建空白sheet2.altf11调出VB3.插入-模块-填入自定义函数Function REVERSE(Str As String)REVERSE StrReverse(Str)End Function 转载于:https://www.cnblogs.com/AWNUygah/p/11350843.html

Stephen Wolfram专访Judea Pearl:从贝叶斯网络到元胞自动机

来源&#xff1a; 集智俱乐部编译&#xff1a;闫和东、徐培 编辑&#xff1a;邓一雪 导语2022年人工智能与数学国际研讨会&#xff08;ISAIM 2022&#xff09;恰逢著名计算机科学家、贝叶斯网络之父 Judea Pearl 85岁生日&#xff0c;会议期间Mathematica创始人 Stephen Wolfra…

excel常用函数

1.截取字符串函数 left&#xff08;&#xff09;   从左边截取 mid()    从中间截取 right()    从右边截取 转载于:https://www.cnblogs.com/AWNUygah/p/11350904.html