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-中介者模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 面向对象设计中鼓励将行为分不到各个对象中,这种分布可能会导致对象间有许多连接.最 ...
- python 生成器 和生成器函数 以及各种推导式
一.生成器 本质就是迭代器. 我们可以直接执⾏__next__()来执⾏ 以下⽣成器 一个一个的创建对象 创建生成器的方式: 1.生成器函数 2.通过生成器 表达式来获取生成器 3.类型转换(看 ...
- js-权威指南学习笔记19
第十九章 jQuery类库 1.传递HTML文本字符串给$()方法,jQuery会根据传入的文本创建好HTML元素并封装为jQuery对象返回. 2.想要遍历jQuery对象中的所有元素时,可以调用e ...
- 【代码笔记】iOS-MBProgressHUD+MJ
一,效果图. 二,工程图. 三,代码. ViewController.m #import "ViewController.h" #import "MBProgressHU ...
- java中return、break、continue的区别
1.return @Testpublic void testReturn(){ for (int j = 1; j < 3; j++) { for (int i = 1; i < 5; i ...
- idea 提交 Push rejected: Push to origin/master was rejected
idea中,发布项目到码云上,当时按照这样的流程添加Git,然后push,提示:push to origin/master war rejected". 解决方案如下: 1.切换到自己项目所 ...
- windows环境下IP多访问
1.E:\wamp64\bin\apache\apache2.4.23\conf\extra\httpd-vhosts.conf 添加: <VirtualHost *:80> Server ...
- CentOS7+ApacheServer2.4+MariaDB10.0+PHP7.0+禅道项目管理软件8.0环境部署
CentOS7+ApacheServer2.4+MariaDB10.0+PHP7.0+禅道项目管理软件8.0环境部署 by:授客 QQ:1033553122 目录 一. 二. 三. 四. 五. 六. ...
- go语言练习:类型转换
package main import "fmt" func main() { var a int var b uint var c float32 var d float64 a ...
- SQL SERVER 2012/ 2014 分页,用 OFFSET,FETCH NEXT改写ROW_NUMBER的用法(转)
写法: 假装有个表Shop,其中有一列ShopName,取100000到100050条数据. ROW_NUMBER 的写法 SELECT * FROM (SELECT ShopName , ROW_N ...