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

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

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

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

  1. ######### 进程其他方法
    import time
  2. import os
  3. from multiprocessing import Process
  4.  
  5. def f1():
  6. print('子进程的pid',os.getpid())
  7. print('aaa')
  8. def f2():
  9. print('bbb')
  10. if __name__ == '__main__':
  11. p1=Process(target=f1,name='宝宝1')
  12. p1.start()
  13. print(p1.name)
  14. print('子进程的pid',p1.pid)
  15. print('父进程的pid', os.getpid())
  16. print(p1.is_alive())#判断进程是否存活,是否还在运行
  17. p1.terminate()#给系统操作发一个结束信号
  18. # 这里需要等待一下 因为代码执行比系统反应快
  19. time.sleep(1)
  20. print(p1.is_alive())
  21. ########################
  22. 宝宝1
  23. 子进程的pid 7352
  24. 父进程的pid 8188
  25. True
  26. False

验证进程隔离例子

  1. import time
  2. from multiprocessing import Process
  3. global_num = 100
  4. def func1():
  5. global global_num
  6. global_num = 0
  7. print('子进程全局变量>>>',global_num)
  8. # print(global_num)会打印出2个100
  9. if __name__ == '__main__':
  10. p1 = Process(target=func1,)
  11. p1.start()
  12. time.sleep(1)
  13. print('主进程的全局变量>>>',global_num)
  14. #################
  15. 子进程全局变量>>> 0
  16. 主进程的全局变量>>> 100

守护进程

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

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

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

抢票程序

  1. #创建一个ticket 文件 里面放上字典
  2. {'count': 1}
  1. ###加锁两种方法
  2. import time
  3. from multiprocessing import Process,Lock
  4.  
  5. # def f1(i,lic):
  6. # lic.acquire()
  7. # time.sleep(1)
  8. # print(i)
  9. # lic.release()
  10. #########第二种加锁写法##########################
  11. def f1(i,lic):
  12. with lic:
  13. time.sleep(1)
  14. print(i)
  15. if __name__ == '__main__':
  16. lic=Lock()
  17. for i in range(10):
  18. p=Process(target=f1,args=(i,lic))
  19. p.start()

抢票程序

  1. import time
  2. from multiprocessing import Process,Lock
  3. def show_t(i):#传参i 10个人查看
  4. with open('ticket','r',encoding='utf-8') as f:
  5. ticket_data = f.read()#读取文件里的内容
  6. t_data = eval(ticket_data)#将里面的文件转成成字典格式
  7. print('%s查询剩余票数为%s'%(i,t_data['count']))
  8. def get_t(i,l1):#传入10个人进行抢票
  9. # with l2:第二种写法
  10. l1.acquire()
  11. #进行加锁循环,而谁能抢到票是由操作系统决定的
  12. with open('ticket', 'r', encoding='utf-8') as f:
  13. ticket_data = f.read()
  14. t_data = eval(ticket_data)
  15.  
  16. if t_data['count'] > 0:#进行判断 如果余票大于0
  17. t_data['count'] -= 1#就进行减1操作
  18. print('%s抢票成功'%i)
  19. time.sleep(0.2)
  20. with open('ticket', 'w') as f:
  21. f.write(str(t_data))
  22. else:
  23. print('没票了!!!')
  24. l1.release()
  25. if __name__ == '__main__':
  26. l1 = Lock()
  27. for i in range(10):
  28. p1 = Process(target=show_t,args=(i,))
  29. p1.start()
  30. for i in range(10):
  31. p2 = Process(target=get_t,args=(i,l1) )
  32. p2.start()
  33.  
  34. ####################
  35. 1查询剩余票数为1
  36. 2查询剩余票数为1
  37. 3查询剩余票数为1
  38. 7查询剩余票数为1
  39. 0查询剩余票数为1
  40. 5查询剩余票数为1
  41. 8查询剩余票数为1
  42. 6查询剩余票数为1
  43. 4查询剩余票数为1
  44. 2抢票成功
  45. 9查询剩余票数为1
  46. 没票了!!!
  47. 没票了!!!
  48. 没票了!!!
  49. 没票了!!!
  50. 没票了!!!
  51. 没票了!!!
  52. 没票了!!!
  53. 没票了!!!
  54. 没票了!!!
  55.  
  56. Process finished with exit code 0

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

队列 Queue

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

队列简单通信

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

数据共享  manager

Joinablequeue

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

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

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

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

包子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. OneinStack——PHP多版本共存

    前言 我事先安装的是LNMP环境,PHP版本为7.2,但是现在环境需要一个PHP5.6,所以就准备安装个上版本,顺带写个安装教程,写完后我发现了原来有直接安装的命令!所以后面的内容大家可以忽略了!从配 ...

  2. GCD HDU - 2588

    输入 N 和 M (2<=N<=1000000000, 1<=M<=N), 找出所有满足1<=X<=N 且 gcd(X,N)>=M 的 X 的数量. Inpu ...

  3. BSGS&扩展BSGS

    BSGS 给定\(a,b,p\),求\(x\)使得\(a^x\equiv b \pmod p\),或者说明不存在\(x\) 只能求\(\gcd(a,p)=1\)的情况 有一个结论:如果有解则必然存在\ ...

  4. 阿里云上,Ubuntu下配置Nginx,在tomcat中加了https协议就不可以了

    问题 阿里云上,Ubuntu服务器,本来部署的是tomcat,并且使用了https 协议.后来为了静态资源分离集成了 nginx,nginx代理跳转到 tomcat.刚开始直接访问http 网址发现, ...

  5. 使用rt-thread中BSP-stm32 ENV构建工具报错

    @2019-01-23 [小记] --路径问题 参照rtt官方<STM32 系列 BSP 制作教程> 构建项目时出现如下错误 error1:打开 menuconfig 出错 解决方法: 根 ...

  6. 定时器同步+触发三ADC采样+输出6路PWM波

    为了熟悉定时器定时器和ADC 用STM32F407DIS做了一个简单的工程: 通过高级定时器TIM1溢出更新时间作为触发输出信号(TRGO),触发TIM8开始计数: 同时TIM1的通道1.2.3以及分 ...

  7. 黑苹果 技嘉 B250M-DS3H-CF i57500 HD630 EFI引导驱动发布

    1. 鉴于苹果的MacOS OSX系统的优越性,由于现在公司的电脑为windows但是自己用的笔记本又是Mac,导致需要适应两套系统,超级麻烦.故想在电脑上装上黑苹果的计划 相关配置地址:https: ...

  8. CSS修改滚动条样式

    <div class="qq_bottom">超出部分变滚动条</div> /*//滚动条整体部分*/ .qq_bottom::-webkit-scroll ...

  9. A1118. Birds in Forest

    Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in ...

  10. (转)每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    背景:在redis集群中,有关于一致性哈希的使用. 一致性哈希:桶大小0~(2^32)-1 哈希指标:平衡性.单调性.分散性.负载性 为了提高平衡性,引入“虚拟节点” 每天进步一点点——五分钟理解一致 ...