美文网首页python学习笔记
multiprocessing模块-多进程知识点

multiprocessing模块-多进程知识点

作者: NewForMe | 来源:发表于2018-09-26 15:33 被阅读0次

    多进程代码

    ' from multiprocessing import Process'
    Process(target=func).start()
    

    方法

    # 进程对象.start()     开启一个子进程
    # 进程对象.join()      感知一个子进程的结束
    # 进程对象.terminate() 结束一个子进程
    # 进程对象.is_alive()  查看某个子进程是否还在运行
    

    属性

    # 进程对象.name        进程名
    # 进程对象.pid         进程号
    # 进程对象.daemon      值为True的时候,表示新的子进程是一个守护进程
            # 守护进程 随着主进程代码的执行结束而结束
            # 一定在start之前设置
    

    多进程锁

    'from multiprocessing import Lock'
    # l = Lock()
    # l.acquire()   # 拿钥匙
    # 会造成数据不安全的操作
    # l.release()   # 还钥匙
    

    多进程的信号量

    这个跟锁的用法差不多,差别就是能够设置钥匙的数量,即进程的数量,普通的锁就是只有一把钥匙

    import time
    import random
    from multiprocessing import Process
    from multiprocessing import Semaphore
    
    def ktv(i,sem):
        sem.acquire()    #获取钥匙
        print('%s走进ktv'%i)
        time.sleep(random.randint(1,5))
        print('%s走出ktv'%i)
        sem.release()   
    
    
    if __name__ == '__main__' :
        sem = Semaphore(4)
        for i in range(20):
            p = Process(target=ktv,args=(i,sem))
            p.start()
    

    多进程的事件

    # from multiprocessing import Event
    # 一个信号可以使所有的进程都进入阻塞状态
    # 也可以控制所有的进程解除阻塞
    # 一个事件被创建之后,默认是阻塞状态
    # e = Event()  # 创建了一个事件
    # print(e.is_set())   # 查看一个事件的状态,默认被设置成阻塞
    # e.set()      # 将这个事件的状态改为True
    # print(e.is_set())
    # e.wait()     # 是依据e.is_set()的值来决定是否阻塞的
    # print(123456)
    # e.clear()    # 将这个事件的状态改为False
    # print(e.is_set())
    # e.wait()     # 等待 事件的信号被变成True
    # print('*'*10)
    
    
    # set 和 clear
        #  分别用来修改一个事件的状态 True或者False
    # is_set 用来查看一个事件的状态
    # wait 是依据事件的状态来决定自己是否在wait处阻塞
        #  False阻塞 True不阻塞
    
    
    # 红绿灯事件
    import time
    import random
    from multiprocessing import Event,Process
    def cars(e,i):
        if not e.is_set():
            print('car%i在等待'%i)
            e.wait()    # 阻塞 直到得到一个 事件状态变成 True 的信号
        print('\033[0;32;40mcar%i通过\033[0m' % i)
    
    def light(e):
        while True:
            if e.is_set():
                e.clear()
                print('\033[31m红灯亮了\033[0m')
            else:
                e.set()
                print('\033[32m绿灯亮了\033[0m')
            time.sleep(2)
    
    if __name__ == '__main__':
        e = Event()
        traffic = Process(target=light,args=(e,))
        traffic.start()
        for i in range(20):
            car = Process(target=cars, args=(e,i))
            car.start()
            time.sleep(random.random())
    

    多进程的队列

    # 队列 先进先出
    # IPC
    # from multiprocessing import Queue
    # q = Queue(3)  #设置队列的长度
    # q.put(1)      #放入数据
    # q.put(2)
    # q.put(3)
    # print(q.full())   # 队列是否满了
    # print(q.get())   #取出数据
    # print(q.get())
    # print(q.get())
    # print(q.empty())   # 判断队列是否为空
    # while True:
    #     try:
    #         q.get_nowait()
    #     except:
    #         print('队列已空')
    #         time.sleep(0.5)
    # for i in range(6):
    #     q.put(i)
    
    from multiprocessing import Queue,Process
    def produce(q):
        q.put('hello')
    
    def consume(q):
        print(q.get())
    
    if __name__ == '__main__':
        q = Queue()
        p = Process(target=produce,args=(q,))
        p.start()
        c = Process(target=consume, args=(q,))
        c.start()
    

    相关文章

      网友评论

        本文标题:multiprocessing模块-多进程知识点

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