• 同步锁2 互斥锁


     1 import threading
     2 import time
     3 
     4 num = 100
     5 def add():
     6     global num
     7     s = num
     8     time.sleep(0.02)
     9     num = s - 1
    10 
    11 l = list()
    12 for i in range(100):
    13     t = threading.Thread(target=add)
    14     l.append(t)
    15     t.start()
    16 for i in l:
    17     i.join()
    18 print(num)
    19 输出:
    20 99
    21 
    22 进程完成,退出码 0

    遇到了IO阻塞,进行了切换。   

    单个线程中间发生了切换。任务只处理了一半。    需要拿出一个解决的办法将正在执行的线程处理完,在进行下一个线程。

    可以进行加上同步锁lock = threading.Lock(),使其变成不阻塞

     1 import threading
     2 import time
     3 
     4 num = 100
     5 lock = threading.Lock()
     6 def add():
     7     lock.acquire()
     8     global num
     9     s = num
    10     time.sleep(0.02)
    11     num = s - 1
    12     lock.release()
    13 
    14 l = list()
    15 for i in range(100):
    16     t = threading.Thread(target=add)
    17     l.append(t)
    18     t.start()
    19 for i in l:
    20     i.join()
    21 print(num)
    22 输出:
    23 0
    24 
    25 进程完成,退出码 0

    加上锁之后就变成串行。

    但是串行的就只有加锁的这三行,所以加锁还是有意义的。其它的代码照常同时是并行的执行。

      1 import threading
      2 import time
      3 
      4 num = 100
      5 lock = threading.Lock()
      6 def add():
      7 
      8     global num
      9     print(num)
     10     lock.acquire()
     11 
     12     s = num
     13 
     14     time.sleep(0.02)
     15     num = s - 1
     16     lock.release()
     17 
     18 l = list()
     19 for i in range(100):
     20     t = threading.Thread(target=add)
     21     l.append(t)
     22     t.start()
     23 for i in l:
     24     i.join()
     25 print(num)
     26 输出:
     27 100
     28 100
     29 100
     30 100
     31 100
     32 100
     33 100
     34 100
     35 100
     36 100
     37 100
     38 100
     39 100
     40 100
     41 100
     42 100
     43 100
     44 100
     45 100
     46 100
     47 100
     48 100
     49 100
     50 100
     51 100
     52 100
     53 100
     54 100
     55 100
     56 100
     57 100
     58 100
     59 100
     60 100
     61 100
     62 100
     63 100
     64 100
     65 100
     66 100
     67 100
     68 100
     69 100
     70 100
     71 100
     72 100
     73 100
     74 100
     75 100
     76 100
     77 100
     78 100
     79 100
     80 100
     81 100
     82 100
     83 100
     84 100
     85 100
     86 100
     87 100
     88 100
     89 100
     90 100
     91 100
     92 100
     93 100
     94 100
     95 100
     96 100
     97 100
     98 100
     99 100
    100 100
    101 100
    102 100
    103 100
    104 100
    105 100
    106 100
    107 100
    108 100
    109 100
    110 100
    111 100
    112 100
    113 100
    114 100
    115 100
    116 100
    117 100
    118 100
    119 100
    120 100
    121 100
    122 100
    123 100
    124 100
    125 100
    126 100
    127 0

    这就是处理办法

  • 相关阅读:
    打印一个0到1之间的数的二进制表示
    bzoj-3223 文艺平衡树
    Linux下使用fstatfs/statfs查询系统相关信息
    Pku3664
    hdu-2544 最短路
    java同步包种ArrayBlockingQueue类的分析与理解
    【剑指offer】不用加减乘除做加法
    PA模块经常使用表
    网络编程
    // 插入排序 源代码
  • 原文地址:https://www.cnblogs.com/ch2020/p/12688828.html
Copyright © 2020-2023  润新知