美文网首页
Python编程之进程总结

Python编程之进程总结

作者: He | 来源:发表于2018-08-26 10:52 被阅读0次

    进程是线程的集合,每个进程至少有一个主线程,进程是在系统中起资源调度的作用,进程分配资源和管理数据,程序的执行都是有线程执行的。进程和线程的执行差不多,也是由时间片根据并发机制执行的。Python中关于进程的内建模块multiprocessing,通过模块的Process类型,可以创建多个进程。
    Lock/RLock,互斥锁/重用锁,进程锁类型、Event事件类型,Condition条件类型可以很方便的完成进程间的同步操作。Queue进程队列类型,用于多进程的数据共享。Listener/Client 进程监听,基于网络多进程间的数据共享。多进程面向对象的实现和多线程的操作类似。自定义进程类型,继承系统进程比哦准类型multiprocessing.Process,重写父类的run()方法,之方法中执行代码。在使用时创建该自定义进程类型的对象,
    进程池:包含多个进程的池塘;包含并且管理多个进程的一个对象Pool
    init(num) 初始化函数,用于创建一个进程池
    apply(function, args) 同步执行一个函数~当进程中的函数执行完成才能退出
    apply_async(function, args) 异步非阻塞执行一个函数
    close()停止向进程池提交任务
    join()让进程池工作完成,才能允许其他进程继续工作

    import multiprocessing, time, os
    def my_proc():
        print(multiprocessing.current_process().name, "一个进程正在工作", os.getppid(), os.getpid())
        time.sleep(1)
    if __name__ == "__main__":
        # 创建一个进程池
        pool = multiprocessing.Pool(2
        # 循环任务
        for i in range(20):
            pool.apply_async(my_proc)
        # 停止提交任务
        pool.close()
        # 独占执行
        pool.join()
    

    现在有一个问题,在进程中,操作变量数据是共享的吗。操作的变量数据都是独立的每个程序在操作系统数据的时候都会先将数据复制一下然后再操作复制的数据,系统内的数据并没有改变。所以进程之间的数据都是相互独立的!

    问题:进程中,操作变量数据,是共享的吗?No 独立的

    from multiprocessing import current_process, Process
    import time

    全局变量:可以被多个进程共享吗?

    ticket = 3
    def my_proc():
        # 1. 多个进程,能不能都读取到全局变量的值?True
        # for i in range(ticket):
        #     print(current_process().name, ":", i)
        # 2. 多个进程,使用的同一个全局变量的值,是共享的吗?
        global ticket
        while ticket > 0:
            print(current_process().name, ": " , ticket)
            ticket -= 1
    

    3. 函数参数处理

    #def my_proc(t):
        # while t > 0:
        #     print(current_process().name, ": ", t)
        #     t -= 1
    
    if __name__ == "__main__":
        # 创建两个进程
        p1 = Process(target=my_proc)
        p2 = Process(target=my_proc)
        # p1 = Process(target=my_proc, args=(ticket,))
        # p2 = Process(target=my_proc, args=(ticket,))
    
        # 启动进程
        p1.start()
        p2.start()
    
        time.sleep(5)
        print(ticket)
    

    问题:进程之间怎么完成数据共享|通信
    import multiprocessing

    解决方案1:通过第三方的东西进行交互
    # A进程将数据存储到文件|数据库中
    # B进程从文件|数据库中读取数据
    # 文件|数据库是独立于A和B进程之外的第三方,能被A/B同时访问

    解决方案2:通过第三方、独立于进程你之外的数据类型完成进程之间的通信
    答案:可以!
    python提供了如下几种方案

    1. 事件对象multiprocessing.Event-进程之间的状态标记通信
      '''
      threading.Event
      multiprocessing.Event
      '''
      event = multiprocessing.Event()
      2.multiprocessing模块中提供了条件类型Condition,可以完成多个进程之间的通信操作
      '''
      threading.Condition
      multiprocessing.Condition
      'acquire', 'notify', 'notify_all', 'release', 'wait', 'wait_for'
      '''

    3.multiprocessing模块中提供了一个数据操作类型Queue,可以完成进程之间的数据简单共享
    不推荐使用
    '''
    threading: queue.Queue队列实现线程间数据的安全共享
    multiprocessing.Queue 进程队列

    get()从队列中获取数据
    get_nowait()从队列中获取数据,非阻塞
    put()向队列中添加数据
    put_nowait()向队列中添加数据,非阻塞
    empty()判断队列是否为空
    full()判断队列是否已满
    qsize()获取队列中元素的个数
    '''
    4.multiprocessing提供了一个专门用来进行多个进程之间数据共享的类型:Manager
    可以在本地多个进程之间完成数据共享和通信,可以在网络上远程的两个主机之间实现数据的共享和通信,可以在网络上远程的两个主机之间
    '''
    用于数据共享:存储数据
    Array:数组
    Queue:列表
    list:用于创建一个存储数据的列表
    ticket_box = multiprocessing.Manager.list()
    dict:用于创建一个存储数据的字典
    ticket_box = multiprocessing.Manager.dict()
    Value:用于创建一个存储数据的变量
    ticket = multiprocessing.Manager.Value('count', 100)

    type a:
    manager = Manager()
    my_list = manager.list()
    my_dict = manager.dict()
    my_value= manager.Value('count', 100)

    type b:
    with Manager() as manager:
    my_list = manager.list()
    my_dict = manager.dict()
    my_value= manager.Value('count', 100)

    数据通信进程管理:
    Lock/RLock:进程锁
    Barrir:进程同步对象
    Semaphore|BoundedSemaphore:信号量进程同步类型
    Event:事件类型
    Condition:条件类型
    Pool:进程池类型

    '''

    相关文章

      网友评论

          本文标题:Python编程之进程总结

          本文链接:https://www.haomeiwen.com/subject/wktoiftx.html