#######################总结#########

主要理解 锁      生产者消费者模型 解耦用的   队列

共享资源的时候 是不安全的 所以用到后面的锁

守护进程:p.daemon = True  #将该进程设置为守护进程,必须写在start之前,意思如果我的主进程代码运行结束了,你这个子进程不管运行到什么地方,都直接结束

######### 进程其他方法
import time
import os
from multiprocessing import Process def f1():
print('子进程的pid',os.getpid())
print('aaa')
def f2():
print('bbb')
if __name__ == '__main__':
p1=Process(target=f1,name='宝宝1')
p1.start()
print(p1.name)
print('子进程的pid',p1.pid)
print('父进程的pid', os.getpid())
print(p1.is_alive())#判断进程是否存活,是否还在运行
p1.terminate()#给系统操作发一个结束信号
# 这里需要等待一下 因为代码执行比系统反应快
time.sleep(1)
print(p1.is_alive())
########################
宝宝1
子进程的pid 7352
父进程的pid 8188
True
False

验证进程隔离例子

import time
from multiprocessing import Process
global_num = 100
def func1():
global global_num
global_num = 0
print('子进程全局变量>>>',global_num)
# print(global_num)会打印出2个100
if __name__ == '__main__':
p1 = Process(target=func1,)
p1.start()
time.sleep(1)
print('主进程的全局变量>>>',global_num)
#################
子进程全局变量>>> 0
主进程的全局变量>>> 100

守护进程

import time
from multiprocessing import Process def f1():
time.sleep(3)
print('xxxxx')
def f2():#加这个函数 为了形成对比
time.sleep(5)
print('普通子进程的代码')
if __name__ == '__main__':
p=Process(target=f1,)
p.daemon=True#将该进程设置为守护进程,必须要在start之前
#子进程代码不管运行到什么地方 都需要结束
p.start() p2=Process(target=f2,)
p2.start()
p2.join()#加上join等待2号普通进程的结束,才继续执行下面主进程中的代码
#就会把f1守护模式中的方法执行出来
#因为f2设置的为5s f1为3s
print('主进程,结束')
##############################

xxxxx
普通子进程的代码
主进程 结束

如果不加 f2 只会输出:主进程 结束

抢票程序

#创建一个ticket 文件 里面放上字典
{'count': 1}
###加锁两种方法
import time
from multiprocessing import Process,Lock # def f1(i,lic):
# lic.acquire()
# time.sleep(1)
# print(i)
# lic.release()
#########第二种加锁写法##########################
def f1(i,lic):
with lic:
time.sleep(1)
print(i)
if __name__ == '__main__':
lic=Lock()
for i in range(10):
p=Process(target=f1,args=(i,lic))
p.start()

抢票程序

import time
from multiprocessing import Process,Lock
def show_t(i):#传参i 10个人查看
with open('ticket','r',encoding='utf-8') as f:
ticket_data = f.read()#读取文件里的内容
t_data = eval(ticket_data)#将里面的文件转成成字典格式
print('%s查询剩余票数为%s'%(i,t_data['count']))
def get_t(i,l1):#传入10个人进行抢票
# with l2:第二种写法
l1.acquire()
#进行加锁循环,而谁能抢到票是由操作系统决定的
with open('ticket', 'r', encoding='utf-8') as f:
ticket_data = f.read()
t_data = eval(ticket_data) if t_data['count'] > 0:#进行判断 如果余票大于0
t_data['count'] -= 1#就进行减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() ####################
1查询剩余票数为1
2查询剩余票数为1
3查询剩余票数为1
7查询剩余票数为1
0查询剩余票数为1
5查询剩余票数为1
8查询剩余票数为1
6查询剩余票数为1
4查询剩余票数为1
2抢票成功
9查询剩余票数为1
没票了!!!
没票了!!!
没票了!!!
没票了!!!
没票了!!!
没票了!!!
没票了!!!
没票了!!!
没票了!!! Process finished with exit code 0

如果没有锁  会有10个进程 进行 异步同时请求   这个顺序是由操作系统决定的  每个人都能执行到 if count>0 都执行了 -1操作,都感觉自己抢到票了,导致结果也不一样

队列 Queue

#####队列简单的解释
from multiprocessing import Process,Queue
q=Queue(3)#创建一个队列对象,长度为3 先进先出
q.put(1)
q.put(2)
q.put(3)
print('>>>',q.qsize())
print(q.full()) #q.full()了解,因为这个东西不可靠,满了返回一个True,不满返回一个False try:
q.put_nowait(4) #不阻塞程序,但是会报错queue.Full,可以通过捕获异常来进行其他的操作
except:
print('队列满了,玩别的去吧') print(q.get())
print(q.get())
print(q.get())
print('是不是空了呀:',q.empty()) #q.empty()了解,因为这个东西不可靠,空了返回一个True,不空返 try:
q.get_nowait() #queue.Empty
except:
print('队列空了,搞得别的事情')
print('拿多啦')

队列简单通信

from multiprocessing import Process,Queue
def f1(q):
q.put('约吗?')
if __name__ == '__main__':
q=Queue(3)
p=Process(target=f1,args=(q,))
p.start()
son_msg=q.get()
print('来自子进程的消息',son_msg)

数据共享  manager

Joinablequeue

  task_done() #给队列发出一个任务处理完毕的信号

  join()#等待放入队列中的任务全部执行完毕,也就是等待task_done()的信号数量,

                     #等于放入队列中的所有任务数量 不会造成阻塞

###生产者 消费者模型
import time
from multiprocessing import Process, Queue, JoinableQueue # 生产者
def producer(q):
for i in range(10):
time.sleep(0.3)
s='包子%s号'%i
print(s+'新鲜出炉')
q.put(s)
q.join()#就等着task_done()信号的数量,和我put进去的数量相同时,才继续执行
print('所有的任务都被处理了,继续潜行吧骚年们')
def consumer(q):
while 1:
time.sleep(0.5)
baozi=q.get()
print(baozi+'被吃了')
q.task_done()#给队列发送一个取出的这个任务已经处理完毕的信号
if __name__ == '__main__':
q = JoinableQueue(30) # 30长度的队列
pro_p=Process(target=producer,args=(q,))
con_p=Process(target=consumer,args=(q,))
pro_p.start()
con_p.daemon=True
con_p.start() pro_p.join()
print('主进程结束') ############################

包子0号新鲜出炉
包子0号被吃了
包子1号新鲜出炉
包子2号新鲜出炉
包子1号被吃了
包子3号新鲜出炉
包子2号被吃了
包子4号新鲜出炉
包子5号新鲜出炉
包子3号被吃了
包子6号新鲜出炉
包子7号新鲜出炉
包子4号被吃了
包子8号新鲜出炉
包子5号被吃了
包子9号新鲜出炉
包子6号被吃了
包子7号被吃了
包子8号被吃了
包子9号被吃了
所有的任务都被处理了,继续潜行吧骚年们
主进程结束

python 进程锁 生产者消费者模型 队列 (进程其他方法,守护进程,数据共享,进程隔离验证)的更多相关文章

  1. 03:进程Queue --- 生产者消费者模型

    1 进程Queue介绍 1 进程间数据隔离,两个进程进行通信,借助于Queue​2 进程间通信:IPC -借助于Queue实现进程间通信    -借助于文件        -借助于数据库    -借助 ...

  2. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

  3. Learning-Python【34】:进程之生产者消费者模型

    一.什么是生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务,在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样 ...

  4. day34 并发编程之生产者消费者模型 队列

    1.守护进程(了解) """ 守护进程 表示 一个进程b 守护另一个进程a 当被守护的进程a结束后 那么b也跟着结束了 就像 皇帝驾崩 妃子殉葬 应用场景 之所以开启子进 ...

  5. Python中的生产者消费者模型

    ---恢复内容开始--- 了解知识点: 1.守护进程: ·什么是守护进程: 守护进程其实就是一个‘子进程’,守护即伴随,守护进程会伴随主进程的代码运行完毕后而死掉 ·为何用守护进程: 当该子进程内的代 ...

  6. Python实现:生产者消费者模型(Producer Consumer Model)

    #!/usr/bin/env python #encoding:utf8 from Queue import Queue import random,threading,time #生产者类 clas ...

  7. 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操

    昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...

  8. Python 35 进程间的通信(IPC机制)、生产者消费者模型

    一:进程间的通信(IPC):先进先出  管道:队列=管道+锁 from multiprocessing import Queue q=Queue(4) q.put(['first',],block=T ...

  9. day35——生产者消费者模型、线程

    day35 进程:生产者消费者模型 编程思想,模型,设计模式,理论等等,都是交给你一种编程的方法,以后你遇到类似的情况,套用即可 生产者消费者模型的三要素 生产者:产生数据的 消费者:接收数据做进一步 ...

随机推荐

  1. #186 path(容斥原理+状压dp+NTT)

    首先只有一份图时显然可以状压dp,即f[S][i]表示S子集的哈密顿路以i为终点的方案数,枚举下个点转移. 考虑容斥,我们枚举至少有多少条原图中存在的边(即不合法边)被选进了哈密顿路,统计出这个情况下 ...

  2. C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)

    参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...

  3. 洛谷P2085最小函数值题解

    题目 首先我们先分析一下题目范围,\(a,b,c\) 都是整数,因此我们可以得出它的函数值在\((0,+\infty )\)上是单调递增的,,然后我们可以根据函数的性质,将每个函数设置一个当前指向位置 ...

  4. 用随机投掷飞镖法计算Pi值(Randomness Throwing dart Pi Python)

    画一个边长为r的正方形和半径为r的四分之一的圆(如下图所示),向上面随机投掷飞镖,通过计算落在星星区域和整体区域的飞镖比例,即可求出π值. 公式推导如下: 假设正方形的边长r为1,那么飞镖落在星星区域 ...

  5. 如何使用JPQL写纯SQL语句

    使用JPQL,需要把SQL语句修改成类似HQL 语句.SQL 查询的是数据库,而JPQL 查询的是对象和属性,在语法上是有些不同的.对于有些用JPQL 无法写出来的查询,还是使用原生SQL写出来方便 ...

  6. 允许外网访问MySQL

    1:设置mysql的配置文件     /etc/mysql/my.cnf     找到 bind-address  =127.0.0.1  将其注释掉://作用是使得不再只允许本地访问:  重启mys ...

  7. Qt Creator 中文编译失败 怎么办

    在Qt Creator 中c++源码有中文字符,结果不能编译成功. 代码 QMessageBox::warning(this, "警告","用户名密码错误",Q ...

  8. python3 集合set

    set是一种集合的数据类型,使用{}表示 集合中元素是无序的,并且不可重复,集合最重要的作用就是可以去重 set是不可哈希的,set中的元素必须是可哈希的 可以切片,可以迭代 交集.并集.差集.对称差 ...

  9. Android assets的一个bug

    摘要 Android assets目录下资源文件超过1MB的问题. 由于要显示一些奇奇怪怪的日文字符,我们在应用里放了一个字库文件,譬如叫做jp.ttf,放在assets目录下打包. 开发.调试一切正 ...

  10. docker_flannel

    目录 一.安装etcd 安装 运行 验证 二.安装和配置 flannel 三. Docker 中使用 flannel 配置 Docker 连接 flannel 容器连接到 flannel 网络 四.f ...