day35
今日内容:
1、进程间互相通信(IPC机制)
2、生产者消费者模型
3、线程理论
4、线程开启的两种方式
5、线程相关属性方法
6、守护线程
7、线程互斥锁
1、进程间相互通信(IPC机制)
主要是一个关于队列的知识:队列=管道+锁
进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的
Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。
maxsize:是指该队列中最大存放个数,省略则为无限大小
q = Queue(4)#生成了一个q队列,该队列最大存放的个数为4
q.put('XX')#往队列里存了第一个值
q.put('DSB')
q.put('爱吃')
q.put('香肠') print(q.get())#从队列里取出第一个值并且删除该值,队列遵行的是先进先出
print(q.get())
print(q.get())
print(q.get())
其中q.put('XX',block = True,timeout=3)block为True(默认值)时,并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列的空间有剩余,如果超时,则会抛出Queue.Full异常。如果blocked为False,但该队列已满,会立即抛出Queue.Full异常。
相同get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.
q.get_nowait():同q.get(False)
q.put_nowait():同q.put(False)
2、生产者和消费者模式
在并发编程中使用生产者和消费者模式能够解决大多数并发问题,该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
在线程世界里,生产者就是生产数据的线程,消费者就是处理数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者,为了解决这个问题于是引入了生产者和消费者模式。
生产者和消费者模式是通过一个容器来解决生产者和消费者的解耦和问题,生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列相当于一个缓冲区,平衡了生产者和消费者的处理能力。
from multiprocessing import Process,Queue
import time,random,os
def consumer(q):
while True:
res=q.get()
time.sleep(random.randint(1,3))
print('\033[45m%s 吃 %s\033[0m' %(os.getpid(),res)) def producer(q):
for i in range(10):
time.sleep(random.randint(1,3))
res='包子%s' %i
q.put(res)
print('\033[44m%s 生产了 %s\033[0m' %(os.getpid(),res)) if __name__ == '__main__':
q=Queue()
p1=Process(target=producer,args=(q,))
c1=Process(target=consumer,args=(q,))
#开始
p1.start()
c1.start()
print('主')
4、线程的介绍:
进程其实是一种资源单位,而线程是一种处理cpu代码的单位
线程其实就是处理代码的过程
线程VS进程
1、统一进程下多个线程共享该进程的资源
2、创建线程的开销远远小于创建进程的开销
3、线程的两种开启方式
方式一:利用threading模块创建线程
from threading import Thread
import time
def task (name):
print('%s is running'%name)
time.sleep(2)
print('%s is done'%name) if __name__ == '__main__':
p = Thread(target=task,args=('子线程',))
p.start()
print('主')
方式二:利用自定义类通过继承threading下的Thread来创建线程
from threading import Thread
import time
class Mythread(Thread):
def run(self):
print('%s is running'%self.name)
time.sleep(2)
print('%s is done'%self.name) if __name__ == '__main__':
p = Mythread()
p.start()
print('主')
5、线程相关属性方法
当某些同属于一个进程下的线程可以共享该进程的资源。
解释代码:
from threading import Thread
import time,random n = 100
def task():
global n
n=0 if __name__ == '__main__':
p = Thread(target=task)
p.start()
p.join()
print(n)
可以通过调用OS模块,并通过调用其模块下的.getpid()方法可以查看的其线程的pid号(线程的pid号和该线程所属的进程的pid号相同)
from threading import Thread import os def task(name):
print('%s is running'%name,os.getpid()) if __name__ == '__main__':
p = Thread(target=task,args=('子线程',))
p.start()
p.join()
print('主',os.getpid())
可以通过导入threading模块下的active_count,可以查看调用时正在执行的线程数量
from threading import Thread,active_count import os def task(name):
print('%s is running'%name,os.getpid()) if __name__ == '__main__':
p = Thread(target=task,args=('子线程',))
p.start()
# time.sleep(1)
print('主',active_count())
可以通过导入threading模块下的current_thread,查看该线程的一些属性
from threading import Thread,active_count,current_thread
import time,random
import os def task():
print('%s is running'%current_thread().name) if __name__ == '__main__':
p = Thread(target=task)
p.start()
time.sleep(1)
print('主',active_count())
6、守护线程
对于主线程来说,运行完毕值得是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就会被回收)。因为主线程的结束意味着进程的结束,进程整体资源都将会被回收,而进程必须保证非守护线程都运行完毕才能结束
from threading import Thread
import time def task(name):
print('老奴%s存活'%name)
time.sleep(3)
print('老奴%s正常死亡'%name) if __name__ == '__main__':
p = Thread(target=task,args=('阿张',))
p.daemon = True
p.start()
time.sleep(4)
print('主')
7、线程互斥锁
由于在同一进程下多个线程能共享此进程的资源,所以如果多个线程要对一个数据进行更改,又由于创建一个线程的时间是很少的大概就是创建一个进程的百分之一的时间,所以就很有可能导致两个或多个线程在同一时间内操作一个数据,这样就会导致数据不安全,所以我们需要将更改数据的这一串代码加锁,加锁的作用就是让原本并发的线程在运行这一段加锁的代码是变成串行,这样就保证了数据的安全性。
from threading import Thread,Lock
import time
mutex = Lock()
n=100
def task():
global n
mutex.acquire()
time.sleep(0.1)
n-=1
mutex.release() if __name__ == '__main__': p_l =[]
for i in range(100):
p = Thread(target=task)
p_l.append(p)
p.start()
for i in p_l:
i.join()
print(n)
print('主')
day35的更多相关文章
- Spark Streaming揭秘 Day35 Spark core思考
Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...
- Activity是如何挂载Pargment的Day35
Activity是如何挂载Pargment的Day35 mebile5.0 1.Fragment优化早上任务 思路 一个主Activity 短信群发器 中秋给朋友发短信,都能够加上他们的姓名,这样他们 ...
- python 全栈开发,Day35(TCP协议 粘包现象 和解决方案)
一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...
- day35 爬虫简述
爬虫概要 - pip3 install requests - pip3 install beautifulsoup4 基本爬虫: - Python实现浏览器行为,requests - beautifu ...
- day35——生产者消费者模型、线程
day35 进程:生产者消费者模型 编程思想,模型,设计模式,理论等等,都是交给你一种编程的方法,以后你遇到类似的情况,套用即可 生产者消费者模型的三要素 生产者:产生数据的 消费者:接收数据做进一步 ...
- day35 守护进程、互斥锁、IPC
day35 守护进程.互斥锁.IPC 1.守护进程 # 守护进程:当父进程执行完毕后,设置的守护进程也会跟着结束# 当一个进程被设置为守护进程后,其不能再产生子进程 from multiproces ...
- day35前端基础之BOM和DOM
day35前端基础之BOM和DOM BOM操作 简介 BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". ...
- 不一样的是不一样的,我的独家滚动条------Day35
在您开始建立自己的,感觉应该先录一个概念:内核的浏览器. 兼容性问题之前多次提及,而在平时经常会遇到兼容性问题.原因,就在于它:浏览器内核.这是比較通俗的说法,事实上应该把它描写叙述的专业点:Rend ...
- Python:Day35 mysql基础
一.数据库管理系统DBMS 软件,存储数据 认证,授权,限制 SqlServer --- 微软(收费) Oracle,sqlite,access...MySQL 服务端和客户端 想要使用MySQL来存 ...
- day35 数据库介绍和初识sql
今日内容: 1. 代码: 简易版socketsever 2.数据库(mysql)简单介绍和分类介绍 3.mysql root修改密码 4.修改字符集编码 5.初识sql语句 1.简易版socketse ...
随机推荐
- python学习之老男孩python全栈第九期_day009之文件操作总结
# 文件处理# 打开文件# open('路径','打开方式', '指定编码方式')# 打开方式:r w a 可读可写:r+ 可写可读:w+ 可追加可读:a+ b# r+ :打开文件直接写,和读完再写 ...
- 【代码笔记】iOS-计算时间差
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...
- jQuery中的deferred对象和extend方法
1⃣️deferred对象 deferred对象是jQuery的回调函数解决方案,它是从jQuery1.5.0版本开始引入的功能 deferred对象的方法 (1) $.Deferred() 生成一个 ...
- 微信小程序< 2 > ~ 微信小程序之头条新闻
简介 上一篇文章,主要是介绍下微信小程序的开发环境安装和微信组件什么的一些基础的开发内容,所以最近一直在业余找练手的机会.由于之前没有接触过JS,自己学习起来还算是比较的吃力,一点一点的来吧!要持久. ...
- SD从零开始29-30
SD从零开始29 外向交货单处理中的特殊功能 批次Batches 你可以在material handled in batches的相关详细屏幕指定一个batch(物料是否使用batches来处理标记在 ...
- ArcGIS 中取出面上最大的Z值的坐标点
def MaxZ(shape): line = shape.getPart(0) pnt = line.next() maxValue = float("-in ...
- php 实现简单购物车功能(2)
上一篇的时候只是写了简单的加入购物车功能,购物车中产品的删除.提交订单后,库存的减少 以及客户账户的余额都没有完善, 这一篇是接着完善上一篇的,上一篇写到了购物车中删除的功能了,为了使删除的代码少敲一 ...
- Linux 修改linux的SSH的默认端口
修改linux的SSH的默认端口 by:授客 QQ:1033553122 安装完linux后,默认的情况下ssh是开放的,容易造到黑客攻击,简单有效的操作之一就是修改默认端口号 步骤一:修改/et ...
- Echarts柱状图百分比显示
option = { tooltip: { trigger: 'item', formatter:'{c}%' //这是关键,在需要的地方加上就行了 }, grid: { borderWidth: 0 ...
- 关于通过ServletContext获取数据出现的http500的错误的解决方案
1.问题的简述 我创建了一个两个servlet以及一个jsp页面,假定给两个servlet分别命名(初始化数据servlet)和(数据处理servlet),jsp页面用于传递数据至数据处理servle ...