zoukankan      html  css  js  c++  java
  • 线程同步

    #如果多个线程共同修改某个数据,就可能出现不可预料的结果。为了保证数据的正确性,需要对多个线程进行同步。
    #使用Thread对象的Lock和RLock可以实现简单的线程同步,这两个对象都有acquire方法和release方法。对于每次只允许一个线程操作的数据,可以将操作放到acquire和release方法之间。
    #多线程的优势在于可以同时运行多个任务,但当线程需要共享数据时,可能存在数据不同步的问题。
    #考虑这样一个情况:一个列表里所有元素都是0,线程set从后向前改为1,而线程print负责从前往后读取列表并输出。
    #线程set开始改的时候,线程print可能就来输出列表了,输出就成了一半0一半1,这就是数据不同步的问题。为了避免这个情况,引入了锁的概念。
    #锁有两种状态:锁定和未锁定。当一个线程(如set)要访问共享数据时,必须先获得锁定;如果已经有别的线程(如print)获得锁定了,就让线程set暂停,也就是同步阻塞;等到线程print访问完毕,释放锁以后,再让线程set继续。
    #经过这样的处理,输出列表要么全部输出0,要么全部输出1,不会再出现一半0一半1。
    #实例代码如下:
     1 #!/usr/bin/python3
     2 #-*-coding:UTF-8-*-
     3 #线程同步
     4 
     5 import threading
     6 from time import sleep
     7 from datetime import datetime
     8 
     9 date_time_format='%y-%M-%d %H:%M:%S'
    10 
    11 class MyThread(threading.Thread):
    12     def __init__(self,threadID,name,counter):
    13         threading.Thread.__init__(self)
    14         self.threadID=threadID
    15         self.name=name
    16         self.counter=counter
    17 
    18     def run(self):
    19         print('开启线程:'+self.name)
    20         #获取锁,用于线程同步
    21         threadLock.acquire()
    22         print_time(self.name,self.counter,3)
    23         #释放锁,开启下一个线程
    24         threadLock.release()
    25 
    26 def date_time_str(date_time):
    27     return datetime.strftime(date_time,date_time_format)
    28 
    29 def print_time(threadName,delay,counter):
    30     while counter:
    31         sleep(delay)
    32         print('%s:%s'%(threadName,date_time_str(datetime.now())))
    33         counter-=1
    34 
    35 def main():
    36     thread1=MyThread(1,'Thread-1',1)
    37     thread2=MyThread(2,'Thread-2',2)
    38 
    39     #开启新线程
    40     thread1.start()
    41     thread2.start()
    42 
    43     #添加线程到线程列表
    44     threads.append(thread1)
    45     threads.append(thread2)
    46 
    47     #等待所有线程完成
    48     for t in threads:
    49         t.join()
    50     print('退出主线程')
    51 
    52 if __name__=='__main__':
    53     threadLock=threading.Lock()
    54     threads=[]
    55     main()
    #执行结果如下:
     1 D:Pythonworkspace>python 线程同步.py
     2 开启线程:Thread-1
     3 开启线程:Thread-2
     4 Thread-1:18-22-30 17:22:36
     5 Thread-1:18-22-30 17:22:37
     6 Thread-1:18-22-30 17:22:38
     7 Thread-2:18-22-30 17:22:40
     8 Thread-2:18-22-30 17:22:42
     9 Thread-2:18-22-30 17:22:44
    10 退出主线程
    #由执行结果看到,程序正确得到了同步效果。
  • 相关阅读:
    python--脚本传参与shell脚本传参(位置参数)
    python--一起来盖个时间戳!!
    python--多线程的应用
    python-局域网内实现web页面用户端下载文件,easy!
    java初始化顺序
    java List<String>的初始化 的一个小问题
    java.util.Queue用法
    C#中的struct(结构)为值类型,struct类型全接触
    Java 实例
    git还原某个特定的文件到之前的版本
  • 原文地址:https://www.cnblogs.com/DLHe/p/8414429.html
Copyright © 2011-2022 走看看