内容回顾

几个问题

  1. 概念多,练习少
  2. 不问问题
    • 概念?代码?

Process类

  1. 并发并行

    • 并发 是同一时间段内多个任务交替使用同一个cpu
    • 并行 是在同一个时刻多个任务在不同的cpu上同时执行
  2. 同步异步
    • 同步 发布一个任务,要等待这个任务结束之后才能继续
    • 异步 发布一个任务,不等待这个任务的结束就可以继续执行当前的内容
  3. 阻塞非阻塞
    • 阻塞 : 在当前任务中cpu不工作
    • 非阻塞 : cpu还在继续为当前程序在执行
  4. start terminate join
    • start\terminate 异步非阻塞
    • join 同步阻塞
  5. io操作
    • i :输入到内存
    • o :从内存向外(网络 硬盘)输出
  1. join
  2. import time
  3. import random
  4. from multiprocessing import Process
  5. def done(name):
  6. num = random.uniform(1, 3)
  7. print('start buy %s'%name,num)
  8. time.sleep(num)
  9. print('end buy %s' % name)
  10. if __name__ == '__main__':
  11. l = []
  12. p1 = Process(target=done,args=('橘子',))
  13. p1.start()
  14. l = [p1]
  15. p2 = Process(target=done, args=('苹果',))
  16. p2.start()
  17. l = [p1,p2]
  18. p3 = Process(target=done, args=('榴莲',))
  19. p3.start()
  20. l = [p1, p2,p3]
  21. p1.join() * 等买橘子的那个人回来 只关心p1这个子进程是否执行完
  22. print('买橘子的那个人回来了')
  23. p2.join() * 等买苹果的人回来
  24. print('买苹果的那个人回来了')
  25. p3.join() * 等待榴莲的人回来
  26. print('买榴莲的那个人回来了')
  1. import time
  2. import random
  3. from multiprocessing import Process
  4. def done(name):
  5. num = random.uniform(1, 3)
  6. print('start buy %s'%name,num)
  7. time.sleep(num)
  8. print('end buy %s' % name)
  9. if __name__ == '__main__':
  10. l = ['橘子','苹果','榴莲']
  11. p_l = []
  12. for fruit in l:
  13. p = Process(target=done,args=(fruit,))
  14. p.start()
  15. p_l.append(p)
  16. print(p_l)
  17. for p in p_l:
  18. p.join() # 阻塞 等橘子回来;阻塞 等苹果回来;阻塞 等榴莲回来

join Process模块提供给我们的 对子进程同步管理的方法

  1. import time
  2. import random
  3. from multiprocessing import Process
  4. def done(name):
  5. num = random.uniform(1, 3)
  6. print('start buy %s'%name,num)
  7. time.sleep(num)
  8. print('end buy %s' % name)
  9. if __name__ == '__main__':
  10. l = ['橘子','苹果','榴莲']
  11. for fruit in l:
  12. p = Process(target=done,args=(fruit,))
  13. p.start()
  14. p.join()

开启进程 Process类

实例化的时候引用的参数 : target = 函数名,args=(参数1,)

方法 : start 开启进程 terminate 结束进程 join等待子进程结束

属性 :
  • name 进程名 pid进程id
  • daemon 一定要在start之前设置,设置
  • 个子进程为守护进程,守护进程在主进程的代码结束之后结束

使用类的方式开启子进程

  1. from multiprocessing import Process
  2. class 类名(Process):
  3. def __init__(self,参数1,参数2):
  4. super().__init__()
  5. self.参数1 = 参数1
  6. self.参数2 = 参数2
  7. def run(self):
  8. '''要写在子进程中的代码
  9. 可以使用self中的所有参数'''
  10. pass
  11. if __name__ == '__main__':
  12. p = 类名('参数1','参数2')
  13. p.start()
  14. from multiprocessing import Process
  15. def func():pass
  16. if __name__ == '__main__':
  17. Process(target=func).start()
  18. a = 1
  19. print(a)

  1. import json
  2. import time
  3. from multiprocessing import Process,Lock
  4. def search_ticket(name):
  5. with open('ticket',encoding='utf-8') as f:
  6. dic = json.load(f)
  7. print('%s查询余票为%s'%(name,dic['count']))
  8. def buy_ticket(name):
  9. with open('ticket',encoding='utf-8') as f:
  10. dic = json.load(f)
  11. time.sleep(2)
  12. if dic['count'] >= 1:
  13. print('%s买到票了'%name)
  14. dic['count'] -= 1
  15. time.sleep(2)
  16. with open('ticket', mode='w',encoding='utf-8') as f:
  17. json.dump(dic,f)
  18. else:
  19. print('余票为0,%s没买到票' % name)
  20. def use(name,lock):
  21. search_ticket(name)
  22. print('%s在等待'%name)
  23. * lock.acquire()
  24. * print('%s开始执行了'%name)
  25. * buy_ticket(name)
  26. * lock.release()
  27. with lock:
  28. print('%s开始执行了'%name)
  29. buy_ticket(name)
  30. if __name__ == '__main__':
  31. lock = Lock()
  32. l = ['alex','wusir','baoyuan','taibai']
  33. for name in l:
  34. Process(target=use,args=(name,lock)).start()
  1. 牺牲了效率 保证了数据的安全
  2. 用户就会觉得很慢 体验很差

锁的应用场景,当多个进程需要操作同一个文件/数据库的时候 ,

会产生数据不安全,我们应该使用锁来避免多个进程同时修改一个文件

队列

  1. 多个进程之间的数据是隔离的
  2. 进程之间的数据交互
  3. 是可以通过网络/文件来实现的
  4. socket来实现

IPC - inter process communication

  • 通过python的模块实现的

    • 基于原生socket
    • 基于进程队列的 *****
  • 第三方的软件/工具来实现 : 基于网络的
    • memcache redis rabbitMQ kafka - 软件名
  1. from multiprocessing import Queue # 可以完成进程之间通信的特殊的队列
  2. from queue import Queue #不能完成进程之间的通信
  3. q = Queue()
  4. q.put(1)
  5. q.put(2)
  6. print(q.get())
  7. print(q.get())
  8. from multiprocessing import Queue,Process
  9. def son(q):
  10. print('-->',q.get())
  11. if __name__ == '__main__':
  12. q = Queue()
  13. Process(target=son,args=(q,)).start()
  14. q.put('wahaha')
  • 生产者消费者模型
  • 获得数据 生产者
  • 处理数据 消费者
  • 调节生产者的个数或者消费者的个数来让程序的效率达到最平衡和最大化
  • 解耦思想
  1. import time
  2. import random
  3. from multiprocessing import Process,Queue
  4. def producer(q):
  5. for i in range(10):
  6. time.sleep(random.random())
  7. food = '泔水%s'%i
  8. print('%s生产了%s'%('taibai',food))
  9. q.put(food)
  10. def consumer(q,name):
  11. while True:
  12. food = q.get() * food = 食物/None
  13. if not food : break
  14. time.sleep(random.uniform(1,2))
  15. print('%s 吃了 %s'%(name,food))
  16. if __name__ == '__main__':
  17. q = Queue()
  18. p1 = Process(target=producer,args=(q,))
  19. p1.start()
  20. c1 = Process(target=consumer,args=(q,'alex'))
  21. c1.start()
  22. c2 = Process(target=consumer,args=(q,'wusir'))
  23. c2.start()
  24. p1.join()
  25. q.put(None)
  26. q.put(None)

如何结束整个程序

  1. import time
  2. import random
  3. from multiprocessing import JoinableQueue,Process
  4. def consumer(jq,name):
  5. while True:
  6. food = jq.get()
  7. time.sleep(random.uniform(1,2))
  8. print('%s吃完%s'%(name,food))
  9. jq.task_done()
  10. def producer(jq):
  11. for i in range(10):
  12. time.sleep(random.random())
  13. food = '泔水%s'%i
  14. print('%s生产了%s'%('taibai',food))
  15. jq.put(food)
  16. jq.join()
  17. if __name__ == '__main__':
  18. jq = JoinableQueue(5)
  19. c1 = Process(target=consumer,args=(jq,'alex'))
  20. p1 = Process(target=producer,args=(jq,))
  21. c1.daemon = True
  22. c1.start()
  23. p1.start()
  24. p1.join()

锁 同一时刻同一段代码,只能有一个进程来执行这段代码

  • 保证数据的安全
  • 多进程中,只有去操作一些 进程之间可以共享的数据资源的时候才需要进行加锁
  • lock = Lock()
  • acquire release
  • with lock:
  • Lock 互斥锁

IPC

  • 队列

    • PUT
    • GET
  • 生产者消费者模型 基于队列把生产数据和消费数据的过程分开了
  • 补充
    • 队列 是进程安全的 自带了锁
    • 队列基于什么实现的 文件家族的socket服务
    • 基于文件家族的socket服务实现的ipc机制不止队列一个,管道Pipe
    • 队列 = 管道 + 锁
    • 管道 是基于文件家族的socket服务实现

from multiprocessing import Pipe

2019-04-16-day033-锁与队列的更多相关文章

  1. 2019.04.16 python基础50

    第五十一节  pycharm安装 https://www.jetbrains.com/pycharm/download/#section=windows 这是另一个叫jetbrains公司开发的 默认 ...

  2. [2019.04.16] 由Python写成的自动解压脚本

    很久很久以前(二十七天吧……大概)被要求写一个脚本来检索并解压磁盘上所有的以特定格式命名的tar文件,于是乎学习和摸鱼就一起开始了. 这次要写的脚本,针对的是这样的文件结构: 文件结构如上图所示 可以 ...

  3. 2019.04.16打卡(java 数组)

    1.  要求输出数组中数据的平均值,并输出所有大于平均值的数据 代码 package block; import java.util.*; public class Average { public ...

  4. day33 锁和队列

    队列 #put 和  get #__author : 'liuyang' #date : 2019/4/16 0016 上午 11:32 # 多进程之间的数据是隔离的 # 进程之间的数据交互 # 是可 ...

  5. 一个无锁消息队列引发的血案(六)——RingQueue(中) 休眠的艺术 [续]

    目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...

  6. 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术

    目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...

  7. Linux 内核:匠心独运之无锁环形队列kfifo

    Linux 内核:匠心独运之无锁环形队列 Kernel version Linux 2.6.12   Author Toney   Email vip_13031075266@163.com   Da ...

  8. PowerBI更新2019/04 - 解决方案架构 - PowerBI Solution Architecture(一图胜万字!)

    Power BI 架构图 (2019/04) 1) Power BI Desktop 是一个免费的工具.它可以用来准备和管理数据模型:包括链接各种数据:做数据清洗:定义关系:定义度量值和层级关系:应用 ...

  9. DPDK 无锁环形队列(Ring)详解

    DPDK 无锁环形队列(Ring) 此篇文章主要用来学习和记录DPDK中无锁环形队列相关内容,结合了官方文档说明和源码中的实现,供大家交流和学习. Author : Toney Email : vip ...

  10. Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04

    Ubuntu LTS 系统学习体会和工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04 ubuntu入门必备pdf:http://download.csdn.net/de ...

随机推荐

  1. 用java 集合和映射实现文章的单词数目统计

    package 一_统计字母出现; import java.io.File; import java.io.FileNotFoundException; import java.util.HashMa ...

  2. 【python】python2.x中的除法

    在生信分析中有许多时候我们需要用到除法,在经历无数次break out 之后我终于发现原来python 2.x中只有整除,而没有浮点除法,这就是没有基础的弊病. 那么如何在python 2.x中运用除 ...

  3. python爬虫——论抓包的正确姿势和学好Javascript的重要性(1)

    没事想爬下数据,就入了scrapy坑,跟着https://zhuanlan.zhihu.com/data-factory这篇教程走,中间被小数量的网站坑过,不过还是写出了爬虫~~ 切糕王子:毫无防御, ...

  4. 3. Dubbo原理解析-Dubbo内核实现之动态编译 (转)

    转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 我们运行的Java代码,一般都是编译之后的字节码 ...

  5. Java 运行时字符编码与解码

    以下仅为个人学习的记录,如有疏漏不妥之处,还请不吝赐教. Java在运行时字符char采用UTF-16进行编码. public class RuntimeEncoding { public stati ...

  6. 类自动调用to.string方法

    所有对象都有toString()这个方法,因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法” 它通常只是为了方便输出,比如System.out.prin ...

  7. 数据库只有mdf文件而没有ldf文件,如何恢复数据库

    举例:数据库名为 TestData 第一步: 新建一个同名的数据库即TestData数据库 第二步: 停掉数据库服务,找到刚才新建的TestData数据库的mdf和ldf文件,删掉ldf文件,再用之前 ...

  8. android中SELINUX规则分析和语法简介【转】

    本文转载自:https://blog.csdn.net/LoongEmbedded/article/details/62430039 1. SELINUX是可以理解为一种Android上面的安全机制, ...

  9. freeswitch编译安装,初探, 以及联合sipgateway, webrtc server的使用场景。

    本文主要记录freeswitch学习过程. 一 安装freeswitch NOTE 以下两种安装方式,再安装的过程中遇到了不少问题,印象比较深刻的就是lua库找到不到这个问题.这个问题发生在make ...

  10. 运行Python出错,提示“丢失api-ms-win-crt-runtime-l1-1-0.dll”

    运行python时出错,提示“丢失api-ms-win-crt-runtime-l1-1-0.dll”, 上网搜了一下说是本地api-ms-win-crt-runtime-l1-1-0.dll 版本过 ...