• 并发安全问题


    守护进程

    守护进程是指一个进程守护另一个进程

    例如a是b的守护进程b如果结束了a也会随之结束

    def task(name):
        print('%s is running' % name)
        time.sleep(3)
    
    if __name__ == '__main__':
        obj = Process(target=task, args=('egon',))
        obj.daemon=True  #守护进程必须在子进程开始前设置
        obj.start()  # 发送信号给操作系统
        print('')

    父进程交给了子进程一个任务,任务还没有完成父进程就结束了,子进程就没有继续执行的意义了

    互斥锁

    互斥锁是为了保证多进程在调用统一资源时不会产生数据错乱的机制。

    解决多进程同时操作一个资源产生错乱的方法有两个
    1.加join:

    def task1():
        print('task1:aaa')
        time.sleep(random.randint(1,3))
        print('task1:aa1')
        time.sleep(random.randint(1, 3))
        print('task1:aa3')
    def task2():
        print('task2:bbb')
        time.sleep(random.randint(1, 3))
        print('task2:bb1')
        time.sleep(random.randint(1, 3))
        print('task2:bb3')
        time.sleep(random.randint(1, 3))
    def task3():
        print('task3:ccc')
        time.sleep(random.randint(1, 3))
        print('task:cc1')
        time.sleep(random.randint(1, 3))
        print('task3:cc3')
        time.sleep(random.randint(1, 3))
    if __name__ == '__main__':
        p1=Process(target=task1,args=(mutex,))
        p2=Process(target=task2,args=(mutex,))
        p3=Process(target=task3,args=(mutex,))
    
        p1.start()
        p1.join(2)    在进程开始时加入join等待上一个进程对数据操作完成后再开始下一进程对数据的操作
        p2.start()
        p2.join(2)
        p3.start()
        

    本质上是吧多进程变成单进程来避免多个进程同时操作一个数据的情况

    mutex=Lock()
    def task1(lock):
        lock.acquire()
        print('task1:aaa')
        time.sleep(random.randint(1,3))
        print('task1:aa1')
        time.sleep(random.randint(1, 3))
        print('task1:aa3')
        lock.release()
    
    def task2(lock):
        lock.acquire()
        print('task2:bbb')
        time.sleep(random.randint(1, 3))
        print('task2:bb1')
        time.sleep(random.randint(1, 3))
        print('task2:bb3')
        time.sleep(random.randint(1, 3))
        lock.release()
    
    def task3(lock):
        lock.acquire()
        print('task3:ccc')
        time.sleep(random.randint(1, 3))
        print('task:cc1')
        time.sleep(random.randint(1, 3))
        print('task3:cc3')
        time.sleep(random.randint(1, 3))
        lock.release()      锁必须有开始和结束,一个acquire必须对应一个release
    
    if __name__ == '__main__':
        p1=Process(target=task1,args=(mutex,))
        p2=Process(target=task2,args=(mutex,))
        p3=Process(target=task3,args=(mutex,))
    p1.start()
    p2.start() p3.start()

    锁可以看作一个运行许可,多个进程同时运行时谁先抢到锁谁才可以运行,没抢到锁的只能等下次

  • 相关阅读:
    Rotate to Attend: Convolutional Triplet Attention Module
    论文阅读:《Automatic Change Detection in Synthetic Aperture Radar Images Based on PCANet》
    论文阅读:Change Detection From Synthetic Aperture Radar Images Based on Channel Weighting-Based Deep Cascade Network
    第二次作业:卷积神经网络 part 2
    CGAN和DCGAN
    GAN
    About me
    极大似然估计与贝叶斯估计
    支持向量机(一)
    非参数估计——Parzen窗与k近邻估计
  • 原文地址:https://www.cnblogs.com/duGD/p/10968758.html
Copyright © 2020-2023  润新知