并发安全问题

守护进程

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

例如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()

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

 

转载于:https://www.cnblogs.com/duGD/p/10968758.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值