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

    1.互斥锁:
      互斥锁:Lock 原理就是把并发变成串行,一个一个运行,不错乱,但效率低
      保证多个进程修改一块数据时,大家是一个一个修改,不错乱
      mutex.acquire()
      mutex.release()

     1 from multiprocessing import Process,Lock
     2 import time
     3 
     4 def task(name,mutex):
     5     mutex.acquire()
     6     print('%s 1'%name)
     7     time.sleep(1)
     8     print('%s 2'%name)
     9     time.sleep(1)
    10     print('%s 3'%name)
    11     mutex.release()
    12 
    13 if __name__ == "__main__":
    14     # 这样写,子进程会copy一份,就变成了全新的锁 ,但是我们应该要让所有的进程持一把锁,
    15     # 所以就把锁 传进去,共用一把锁
    16     mutex = Lock()
    17     for i in range(3):
    18         p = Process(target=task,args=('进程%s'%i,mutex))
    19         p.start()
    20 """
    21 # 大家共享资源,错乱了,这里共享终端,打印,结果3个进程错位打印了 
    22 进程1 1
    23 进程2 1
    24 进程0 1
    25 进程2 2
    26 进程0 2
    27 进程1 2
    28 进程1 3
    29 进程0 3
    30 进程2 3
    31 """
    32 """
    33 # 执行效率低了,但是保证了不错乱  
    34 进程0 1
    35 进程0 2
    36 进程0 3
    37 进程2 1
    38 进程2 2
    39 进程2 3
    40 进程1 1
    41 进程1 2
    42 进程1 3
    43 """
    2.模拟抢票:
      多个进程操作同一个文件时,需要上互斥锁:eg:抢票往文件里的票数-1,否则有问题,多人都抢到票,但只有一张
       mutex.acquire()
      mutex.release()
     1 import json
     2 import time
     3 from multiprocessing import Process,Lock
     4 
     5 
     6 def search(name):
     7     time.sleep(1)
     8     dic = json.load(open('db.txt', 'r', encoding='utf-8'))
     9     print('<%s> 查看剩余票数【%s】'%(name,dic['count']))
    10 
    11 def get(name):
    12     time.sleep(1)
    13     dic = json.load(open('db.txt', 'r', encoding='utf-8'))
    14     if dic['count'] > 0:
    15         dic['count'] -= 1
    16         time.sleep(3)
    17         json.dump(dic,open('db.txt','w',encoding='utf-8'))
    18         print('<%s> 购票成功'%name)
    19 
    20 def task(name,mutex):
    21     search(name)
    22     mutex.acquire()    # 加上互斥锁 之后,就可以只有一个人购票成功了
    23     get(name)
    24     mutex.release()
    25 
    26 if __name__ == "__main__":
    27     mutex = Lock()
    28     for i in range(10):
    29         p = Process(target=task,args=('路人%s'%i,mutex))
    30         p.start()
    3.互斥锁与join区别:
      join:是把代码整体变成了串行
      互斥锁:可以把局部的代码变成串行,只对“共享数据修改”那里上锁

     1 import json
     2 import time
     3 from multiprocessing import Process,Lock
     4 
     5 
     6 def search(name):
     7     time.sleep(1)
     8     dic = json.load(open('db.txt', 'r', encoding='utf-8'))
     9     print('<%s> 查看剩余票数【%s】'%(name,dic['count']))
    10 
    11 def get(name):
    12     time.sleep(1)
    13     dic = json.load(open('db.txt', 'r', encoding='utf-8'))
    14     if dic['count'] > 0:
    15         dic['count'] -= 1
    16         time.sleep(3)
    17         json.dump(dic,open('db.txt','w',encoding='utf-8'))
    18         print('<%s> 购票成功'%name)
    19 
    20 def task(name):
    21     search(name)
    22     # mutex.acquire()    # 加上互斥锁 之后,就可以只有一个人购票成功了
    23     get(name)
    24     # mutex.release()
    25 
    26 if __name__ == "__main__":
    27     mutex = Lock()
    28     for i in range(10):
    29         p = Process(target=task,args=('路人%s'%i,))
    30         p.start()
    31         p.join()
  • 相关阅读:
    python
    mysql 操作
    you-get 使用代理
    恢复本地策略组--用于启动项管理等
    bat批处理——获取文件夹下所有文件名/重命名
    cmd--set用法,下次补充实例
    bat+7z批量压缩"文件夹"
    Excel提取字符串示例
    cron
    AIX修改用户密码登录不成功案例分享
  • 原文地址:https://www.cnblogs.com/mumupa0824/p/9395811.html
Copyright © 2011-2022 走看看