内容回顾

几个问题

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

Process类

  1. 并发并行

    • 并发 是同一时间段内多个任务交替使用同一个cpu
    • 并行 是在同一个时刻多个任务在不同的cpu上同时执行
  2. 同步异步
    • 同步 发布一个任务,要等待这个任务结束之后才能继续
    • 异步 发布一个任务,不等待这个任务的结束就可以继续执行当前的内容
  3. 阻塞非阻塞
    • 阻塞 : 在当前任务中cpu不工作
    • 非阻塞 : cpu还在继续为当前程序在执行
  4. start terminate join
    • start\terminate 异步非阻塞
    • join 同步阻塞
  5. io操作
    • i :输入到内存
    • o :从内存向外(网络 硬盘)输出
join
import time
import random
from multiprocessing import Process
def done(name):
    num = random.uniform(1, 3)
    print('start buy %s'%name,num)
    time.sleep(num)
    print('end buy %s' % name)

if __name__ == '__main__':
    l = []
    p1 = Process(target=done,args=('橘子',))
    p1.start()
    l = [p1]
    p2 = Process(target=done, args=('苹果',))
    p2.start()
    l = [p1,p2]
    p3 = Process(target=done, args=('榴莲',))
    p3.start()
    l = [p1, p2,p3]
    p1.join()   * 等买橘子的那个人回来 只关心p1这个子进程是否执行完
    print('买橘子的那个人回来了')
    p2.join()   * 等买苹果的人回来
    print('买苹果的那个人回来了')
    p3.join()   * 等待榴莲的人回来
    print('买榴莲的那个人回来了')
import time
import random
from multiprocessing import Process
def done(name):
    num = random.uniform(1, 3)
    print('start buy %s'%name,num)
    time.sleep(num)
    print('end buy %s' % name)

if __name__ == '__main__':
    l = ['橘子','苹果','榴莲']
    p_l = []
    for fruit in l:
        p = Process(target=done,args=(fruit,))
        p.start()
        p_l.append(p)
    print(p_l)
    for p in p_l:
        p.join()   # 阻塞 等橘子回来;阻塞 等苹果回来;阻塞 等榴莲回来

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

import time
import random
from multiprocessing import Process
def done(name):
    num = random.uniform(1, 3)
    print('start buy %s'%name,num)
    time.sleep(num)
    print('end buy %s' % name)

if __name__ == '__main__':
    l = ['橘子','苹果','榴莲']
    for fruit in l:
        p = Process(target=done,args=(fruit,))
        p.start()
        p.join()

开启进程 Process类

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

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

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

使用类的方式开启子进程

from multiprocessing import Process
class 类名(Process):
    def __init__(self,参数1,参数2):
        super().__init__()
        self.参数1 = 参数1
        self.参数2 = 参数2
    def run(self):
        '''要写在子进程中的代码
        可以使用self中的所有参数'''
        pass
if __name__ == '__main__':
    p = 类名('参数1','参数2')
    p.start()

from multiprocessing import Process
def func():pass

if __name__ == '__main__':
    Process(target=func).start()
    a = 1
print(a)

import json
import time
from multiprocessing import Process,Lock
def search_ticket(name):
   with open('ticket',encoding='utf-8') as f:
       dic = json.load(f)
       print('%s查询余票为%s'%(name,dic['count']))

def buy_ticket(name):
   with open('ticket',encoding='utf-8') as f:
       dic = json.load(f)
   time.sleep(2)
   if dic['count'] >= 1:
       print('%s买到票了'%name)
       dic['count'] -= 1
       time.sleep(2)
       with open('ticket', mode='w',encoding='utf-8') as f:
           json.dump(dic,f)
   else:
       print('余票为0,%s没买到票' % name)

def use(name,lock):
   search_ticket(name)
   print('%s在等待'%name)
   * lock.acquire()
   * print('%s开始执行了'%name)
   * buy_ticket(name)
   * lock.release()
   with lock:
       print('%s开始执行了'%name)
       buy_ticket(name)

if __name__ == '__main__':
   lock = Lock()
   l = ['alex','wusir','baoyuan','taibai']
   for name in l:
       Process(target=use,args=(name,lock)).start()
  1. 牺牲了效率 保证了数据的安全
  2. 用户就会觉得很慢 体验很差

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

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

队列

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

IPC - inter process communication

  • 通过python的模块实现的

    • 基于原生socket
    • 基于进程队列的 *****
  • 第三方的软件/工具来实现 : 基于网络的
    • memcache redis rabbitMQ kafka - 软件名
from multiprocessing import Queue # 可以完成进程之间通信的特殊的队列
from queue import Queue    #不能完成进程之间的通信

q = Queue()
q.put(1)
q.put(2)
print(q.get())
print(q.get())

from multiprocessing import Queue,Process

def son(q):
    print('-->',q.get())

if __name__ == '__main__':
    q = Queue()
    Process(target=son,args=(q,)).start()
    q.put('wahaha')
  • 生产者消费者模型
  • 获得数据 生产者
  • 处理数据 消费者
  • 调节生产者的个数或者消费者的个数来让程序的效率达到最平衡和最大化
  • 解耦思想
import time
import random
from multiprocessing import Process,Queue
def producer(q):
    for i in range(10):
        time.sleep(random.random())
        food = '泔水%s'%i
        print('%s生产了%s'%('taibai',food))
        q.put(food)

def consumer(q,name):
    while True:
        food = q.get()   * food = 食物/None
        if not food : break
        time.sleep(random.uniform(1,2))
        print('%s 吃了 %s'%(name,food))

if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=producer,args=(q,))
    p1.start()
    c1 = Process(target=consumer,args=(q,'alex'))
    c1.start()
    c2 = Process(target=consumer,args=(q,'wusir'))
    c2.start()
    p1.join()
    q.put(None)
    q.put(None)

如何结束整个程序

import time
import random
from multiprocessing import JoinableQueue,Process

def consumer(jq,name):
    while True:
        food = jq.get()
        time.sleep(random.uniform(1,2))
        print('%s吃完%s'%(name,food))
        jq.task_done()

def producer(jq):
    for i in range(10):
        time.sleep(random.random())
        food = '泔水%s'%i
        print('%s生产了%s'%('taibai',food))
        jq.put(food)
    jq.join()

if __name__ == '__main__':
    jq = JoinableQueue(5)
    c1 = Process(target=consumer,args=(jq,'alex'))
    p1 = Process(target=producer,args=(jq,))
    c1.daemon = True
    c1.start()
    p1.start()
    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. Dvelopment descriptor

    部署描述符是JavaEE程序常见的一部分,但是之前都没有较为全面的学习过,这里就较为全面的记录一下部署描述符中的元素.部署一个Servlet 3 或以上应用程序是一件轻而易举的事.通过Servlet注 ...

  2. IDEA循环依赖报错解决方案

    step1.查找循环依赖 step2.在IDEA菜单栏中打开Analyze->Analyze Module Dependencies...看到有的模块被红色的标出来了,此时右边显示了循环依赖,那 ...

  3. 【Alpha】Scrum Meeting 6

    目录 前言 任务分配 燃尽图 会议照片 签入记录 困难 前言 第6次会议在4月10日22:00由PM在一公寓三楼召开. 交流确认了任务进度,对下一阶段任务进行分配.时长15min. 任务分配 姓名 当 ...

  4. Spring 学习——Spring AOP——AOP概念篇

    AOP AOP的定义:AOP,Aspect Oriented Programming的缩写,意为面向切面编程,是通过预编译或运行期动态代理实现程序功能处理的统一维护的一种技术 实现方式 预编译 Asp ...

  5. Ingenious Lottery Tickets 【排序】

    问题 I: Ingenious Lottery Tickets 时间限制: 1 Sec  内存限制: 128 MB 提交: 590  解决: 135 [提交] [状态] [命题人:admin] 题目描 ...

  6. 微信小程序开发学习记录

    两天撸了一遍小程序的文档,跟网页相似,个人感觉是简化版.但是因为开放了很多微信自带的接口又使得部分功能开发起来相对方便 思维导图如下: 目前我的理解大概是这么个逻辑,以后深入学习后可能会有更改 跟着大 ...

  7. angular --- s3core移动端项目(二)

    product-ctrl.js angular.modules('myApp').controller('ProductCtrl',['$scope','$rootScope','$timeout', ...

  8. Maven的pom配置文件

    1.1           Maven的pom配置文件 1.1.1            pom文件内容和作用 Pom.xml文件用来设置项目的项目依赖.插件.项目版本等信息,其中必须的是xml的根元 ...

  9. Rails-Treasure chest2 嵌套表单;

    嵌套表单1-1 嵌套表单1-多 选日期时间的UI (一个jquery Plugin) 拆除前后台css和js Rich Editor, 显示输入的HTML tag 批次编辑/删除 嵌套表单1-1 核心 ...

  10. script利用src引用外部js文件,如果内部嵌套了js代码呢

    <script src='test.js' defer async> var a = 5; </script> 这个时候 var a = 5;会被忽略.