zoukankan      html  css  js  c++  java
  • Python--并发编程

    守护进程

    看主程序是否还在执行
    最后回收进程
    如果最后一行主程序代码执行完还没有执行,那就直接被干死
    同步锁/互斥锁:

    LOCK 模块

    锁住一部分并行
    一部分串行
    lock=Lock()
    在args里面将lock传进去
    lock.acquire()来枷锁 加锁
    中间是要执行这段程序,别人等待开锁再进行
    lock.release()来解放锁  开锁
    速度慢但是牺牲速度保证安全问题
    效率低
    需要自己加锁处理

    IPC机制

    进程之间通信
    共享带来竞争
    要找共享的内存空间
    对应两种:

    1.队列

    form multiprocessing import Queue
    q=Queue(3)    #最大放多少
    
    q.put({'a':1})   #向里面放东西
    q.put('bbb')
    q.put((3,2,1))
    
    
    q.get()  #取值  第几次取就是取第几次放的值 先进先出
    
    
    q.put_nowait   #放的时候不等如果满了就报异常

    取得时候也是,取得时候不等,如果没了就报是空的

    2.管道

    两个用的都是内存空间,用的是共享内存

    生产者消费者模型(非常重要)

    生产者:创造数据
    消费者:处理数据
    平衡两者之间的速度差
    找一个中间的机制IPC机制(队列)
    生产者消费者解耦合
    两个人跟机制相关
    frommultiprocessing inport Queue,Process
    q=Queue()
    创造一个队列
    JoinableQueue可以给q添加join功能,等待q.task_done() 判断是否取完取完的话生产者
    的join就结束
    Manager()创造一个在内存的共享对象

    进程池

    同步调用

    提交完任务后,在原地等待任务结束,一旦结束可以立刻拿到结果

    阻塞

    正在进行的进程遇到io则进入阻塞状态

    异步调用

    提交完任务后,不会在原地等待任务结束,会继续提交下一次任务,等到所有任务都结束后,才get结果

    非阻塞

    可能是运行状态,也可能是就绪状态

    异步调用

    from multiprocessing import  Pool
    import os,time,random
    def work(n):
        print('%s is working'%os.getpid())
        time.sleep(random.randint(1,3))
        return n
    if __name__=='__main__':
        p=Pool(4)
        objs=[]
        for i in range(10):
             res=p.apply_async(work,args=(i,))
             objs.append(res)
        p.close()
        p.join()
        for obj in objs:
            print(obj.get())

    回调函数

    函数回调callback里面的函数名不要传参,参数就前面任务执行结果,运行时间不能大于前面的
    应用爬虫边下边解析

    线程

    进程是一个资源单位,把资源集中起来,线程是执行的流水线
    1.同一进程内的多个线程是共享该进程的资源
    2.创建新的线程开销要远远小于开启新的进程
    推荐书(现代操作系统)
    子线程与主线程pid都是一样的
    同一进程内的多个线程共享该进程的资源
    主进程和子进程在不同的地址空间

    线程对象的其他方法

    .is_alive()判断是否存活
    active_Count()活跃进程的数目
    enumerate()当前活跃进程列表形式
    current_thread().geName()

    守护线程

    主线程从执行角度就代表了该进程,主线程会在所有的非守护线程都运行完毕才结束
    守护线程在主线程结束后结束

  • 相关阅读:
    如何提升Web前端性能?
    简述Linux开机启动流程
    教你玩转Linux系统目录结构
    FreeBSD虚拟机 VMware Tools 安装教程
    何为KVM克隆和快照
    Knockout 新版应用开发教程之Computed Observables
    Knockout 新版应用开发教程之Observable与computed
    前端MVC框架Backbone 1.1.0源码分析系列
    Knockout 新版应用开发教程之创建view models与监控属性
    看看国外的javascript题目,你能全部做对吗?
  • 原文地址:https://www.cnblogs.com/gaoshengyue/p/7666345.html
Copyright © 2011-2022 走看看