day31 锁 队列 前面课程重点总结
今日内容:
1.进程的其他方法
2.僵尸进程和孤儿进程(了解)
3.验证进程之间是空间隔离的
4.守护进程
5.进程锁 重点(又叫同步锁,互斥锁)
6.进程队列(重点) Queue
7.生产者消费者模型
8.管道,进程的数据共享,信号量,事件(了解)
1.进程的其他方法
进程的ID import os
查看子进程的ID os.getpid()
查看子进程的父进程的id os.getppid()
进程名字,
p1=process(target=f1,)
print(p1.name)
查看进程是否活着,
p1.is_alive() # 查看进程是否还活着
发送结束进程的信号
p1.terminate() # 给操作系统发送一个结束进程的信号
2.僵尸进程和孤儿进程(了解)
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
僵尸进程是有害的
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
孤儿进程是无害的.
3.验证进程之间是有空间隔离的
from multiprocessing import Process num=100 def f1():
global num
num=30
print('子进程中的num',num) if __name__=='__main__':
p=Process(target=f1,)
p.start()
p.join()
print('主进程中的num',num)
最后的结果为, 打印的子进程的num的值为:30 打印的主进程中的num的值为:100,因此我们可以判断出进程之间是存在空间隔离的.
4.守护进程
守护进程: 将f1 设置为守护进程后,如果主进程结束后,f1的进程不管运行到什么地方,都是直接结束的.
import time
from multiprocessing import Process def f1():
time.sleep(1)
print('我是f1') def f2():
time.sleep(2)
print('我是f2') if __name__=='__main__':
p1=Process(target=f1,)
p2=Process(target=f2,)
p1.daemon=True# 此处为设置守护进程,设置守护进程必须在执行start之间设置,
守护进程的意思是如果我主进程的代码运行结束,那么你这个守护进程不管运行到什么地方,都要直接结束
p1.start()
p2.start()
p2.join()# 等待p2执行完毕后在运行主进程
print('主进程结束')
开启一个不同的子进程来验证一下守护进程的结束只和主进程的代码运行结束有关系,而整个程序的结束需要主进程和普通的子进程的代码都运行结束才结束.
5.进程锁,又叫互斥锁,同步锁(重点)
语法:
from multiprocessing import Process,Lock
1)
def f1(loc):
loc.acquire() # 上锁,保证程序运行到这里只能有一个进程进入里面执行
要锁的内容......
loc.release() # 解锁 ,程序代码运行完毕,开锁后,剩下的程序才能能继续抢这把锁
if __name__=='__main__':
loc=Lock() # 创建进程锁
p=Process(target=f1,args=(loc,))
2)
def f1(loc):
wIth loc:
要锁的内容......
if __name__=='__main__':
loc=Lock() # 创建进程锁
p=Process(target=f1,args=(loc,))
# 互斥锁/进程锁/同步锁
# import json
import time
from multiprocessing import Process,Lock
def show_t(i):
with open('ticket','r',encoding='utf-8') as f:
ticket_data = f.read()
# print(ticket_data)
t_data = eval(ticket_data)
# print(t_data,type(t_data))
print('%s查询剩余票数为%s'%(i,t_data['count'])) def get_t(i,l1):
l1.acquire()
with open('ticket', 'r', encoding='utf-8') as f:
ticket_data = f.read()
# print(ticket_data)
t_data = eval(ticket_data)
# print(t_data,type(t_data))
# print('%s查询剩余票数为%s' % (i, t_data['count']))
if t_data['count'] > 0:
t_data['count'] -= 1
print('%s抢票成功'%i)
time.sleep(0.2)
with open('ticket', 'w') as f:
f.write(str(t_data))
else:
print('没票了!!!')
l1.release() if __name__ == '__main__':
l1 = Lock()
for i in range(10):
p1 = Process(target=show_t,args=(i,))
p1.start()
for i in range(10):
p2 = Process(target=get_t,args=(i,l1) )
p2.start()
6.进程队列(重点) Queue
from multiprocessing import Process
q=Queue(5) # 这个队列只能放5个进程
q.put() # 往进程队列中放数据,如果进程满了会等待
q.get()# 从进程队列中拿数据
q.qsize()# 查看进程中数据的个数
q.empty() # 查看进程是否是空的
q.full() # 查看进程是否是满的
q.get_nowait()# 不等待,但是报错 一般 用try 尝试使用
q.put_nowait()# 不等待,但是报错 一般 用try 尝试使用
7.生产者消费者模型
import time
from multiprocessing import Process,Queue # 生产者
def producer(q):
for i in range():
time.sleep(1)
s=f'大包子{i}号'
print('新鲜出炉的'+s) #消费者
def consumer(q):
while 1:
time.sleep(2)
baozi=q.get()
print(baozi+'被吃了') if __name__=='__main__':
q=Queue(10)
pro_obj=Process(target=producer,args=(q,))
con_obj=Process(target=consumer,args=(q,))
pro_obj.start()
con_obj.start()
精简SVIP版生产者消费者模型
import time
from multiprocessing import Process,Queue,JoinableQueue def producer(q):
for i in range(10):
time.sleep(1)
s=f'大包子{i}号'
print('新鲜出炉的'+s)
q.put(s)
q.join()# 等着task_done()信号的数量,和我put进去的数量相同时,才继续执行
print('所有的包子都生产完毕了') def consumer(q):
while 1:
time.sleep(2)
baozi=q.get()
print(baozi+'被吃了')
q.task_done() # 给队列发送一个去处的这个任务已经处理完毕的信号 if __name__=='__main__':
q=JoinableQueue(30) # 和Queue一样都是创建一个长度为30的队列
pro_obj=Process(target=producer,args=(q,))
con_obj=Process(target=consumer,args=(q,))
pro_obj.start()
con_obj.start()
pro_obj.join()# 等生产者把包子全部生产完之后在结束
print('主程序结束')
什么是阻塞IO模型
IO模型就是当程序遇到阻塞的时候,程序会阻塞在这个地方不继续向下执行,直到阻塞执行完成之后,才向下执行 #实例代码:
import socket ser=socket.socket()
ser.bind(('127.0.0.1',8000))
ser.listen()
while True:
#建立连接的时候会发生IO阻塞,如果没有建立连接,会一直阻塞在这里
conn.addr = ser.accept()
#接收和发送消息的时候也会发生IO阻塞,在数据量大的时候才能感觉出来
data = conn.recv(1024)
conn.send(xxx) conn.close()
什么是非阻塞IO模型(不推荐使用)
当程序遇到阻塞后,立即切换到下一步去执行下一步的代码,期间不会产生阻塞和时间等待 #实例代码:
import socket
ser=socket.socket()
ser.bind(('127.0.0.1',8000))
ser.listen()
#将下面的代码都变成了非阻塞IO模型,如果遇到IO阻塞后会出现BlockingIOError,在这里如果检测到这个错误,就是已经设置了IO非阻塞模型
ser.setblocking(False) clist=[]
wlist=[]
while True:
try:
#检测IO阻塞的错误
conn.addr = ser.accept()
#如果捕获到IO阻塞异常之后,就不会添加到这个列表中
clist.append(conn)
except BlockingIOError:
del_clist = []
#这个for循环做的事是专门收消息
for conn in clist:
try:
data = conn.recv(1024)
#如果没有拿到数据,就把它删除掉
if not data:
del_clist.append(conn)
continue
conn.send(发送的数据)
wlist.append((conn,发送的数据)) except BlockingIOError:
continue
except Exception:
conn.close()
del_clist.append(conn)
#专门发消息
del_wlist=[]
for msg in wlist:
try:
conn=msg[0]
data=msg[1]
conn.send(data)
del_wlist.append(msg)
except BlockingIOError:
pass
#将发送成功之后的那个元组从之前的列表中删除
for dd in del_wlist:
w_list.remove(dd)
#将发送完成之后关闭的套接字删除掉
for d in del_clist:
c_list.remove(d)
day31 锁 队列 前面课程重点总结的更多相关文章
- zeromq源码分析笔记之无锁队列ypipe_t(3)
在上一篇中说到了mailbox_t的底层实际上使用了管道ypipe_t来存储命令.而ypipe_t实质上是一个无锁队列,其底层使用了yqueue_t队列,ypipe_t是对yueue_t的再包装,所以 ...
- AQS学习(一)自旋锁原理介绍(为什么AQS底层使用自旋锁队列?)
1.什么是自旋锁? 自旋锁作为锁的一种,和互斥锁一样也是为了在并发环境下保护共享资源的一种锁机制.在任意时刻,只有一个执行单元能够获得锁. 互斥锁通常利用操作系统提供的线程阻塞/唤醒机制实现,在争用锁 ...
- 无锁队列以及ABA问题
队列是我们非常常用的数据结构,用来提供数据的写入和读取功能,而且通常在不同线程之间作为数据通信的桥梁.不过在将无锁队列的算法之前,需要先了解一下CAS(compare and swap)的原理.由于多 ...
- HashMap的原理与实 无锁队列的实现Java HashMap的死循环 red black tree
http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html https://zh.wikipedia.org/wiki/%E7%BA ...
- boost 无锁队列
一哥们翻译的boost的无锁队列的官方文档 原文地址:http://blog.csdn.net/great3779/article/details/8765103 Boost_1_53_0终于迎来了久 ...
- 一个可无限伸缩且无ABA问题的无锁队列
关于无锁队列,详细的介绍请参考陈硕先生的<无锁队列的实现>一文.然进一步,如何实现一个不限node数目即能够无限伸缩的无锁队列,即是本文的要旨. 无锁队列有两种实现形式,分别是数组与链表. ...
- 无锁队列--基于linuxkfifo实现
一直想写一个无锁队列,为了提高项目的背景效率. 有机会看到linux核心kfifo.h 原则. 所以这个实现自己仿照,眼下linux我们应该能够提供外部接口. #ifndef _NO_LOCK_QUE ...
- CAS简介和无锁队列的实现
Q:CAS的实现 A:gcc提供了两个函数 bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)// ...
- Go语言无锁队列组件的实现 (chan/interface/select)
1. 背景 go代码中要实现异步很简单,go funcName(). 但是进程需要控制协程数量在合理范围内,对应大批量任务可以使用"协程池 + 无锁队列"实现. 2. golang ...
随机推荐
- Xcode打包上传遇到的坑
1.安装测试包的时候提示APIInternalError ①是否增加了测试设备的UUID ②是否使用adhoc证书打包 2.打包错误:error: couldn't remove '/Users/xx ...
- 修改TP5中common模块默认不能使用问题
在TP5框架中common模块是一个特殊的模块,默认是禁止直接访问的,一般用于放置一些公共的类库用于其他模块的继承.其实是可以访问common模块的, 只需要把convention.php文件中的 / ...
- 日常英语---六、Maplestory Illium
日常英语---六.Maplestory Illium 一.总结 一句话总结: maplestory-['meiplstɔri] illium-镍铬合金 ['meiplstɔri] n. 枫之谷(网 ...
- R语言中知识点总结(一)
source("http://bioconductor.org/biocLite.R") biocLite("GEOquery") library(Biobas ...
- 20165327 预备作业3 Linux安装及学习
20165327 预备作业3 Linux安装及学习 一.学习基于VirtualBox虚拟机安装Ubuntu图文教程,在自己笔记本上安装Linux操作系统,注意尽量选用最新版本的VirtualBox和U ...
- Web版记账本开发记录(一)
//index.js var util = require("../../utils/util.js"); //获取应用实例 var app = getApp(); Page({ ...
- python+requests接口自动化测试框架实例详解教程
1.首先,我们先来理一下思路. 正常的接口测试流程是什么? 脑海里的反应是不是这样的: 确定测试接口的工具 —> 配置需要的接口参数 —> 进行测试 —> 检查测试结果(有的需要数据 ...
- 通过DBMS_REDEFINITION包对表在线重定义
基础介绍 Oracle Online Redefinition可以保证在数据表进行DDL类型操作,如插入.删除数据列,分区处理的时候,还能够支持DML操作,特别是insert/update/delet ...
- PostgreSQL主备流复制机制
原文出处 http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...
- E - Let's Go Rolling!
题目描述:数轴上有nn个质点,第ii个质点的坐标为xixi,花费为cici,现在要选择其中一些点固定,代价为这些点的花费,固定的点不动,不固定的点会向左移动直至遇到固定的点,代价是这两点的距离,如果左 ...