python线程的同步

来源:互联网 发布:c语言函数调用过程 编辑:程序博客网 时间:2024/05/19 18:42

使用Threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法:也可以使用thread创建线程。
有关于线程的同步:当多个线程同时对一组数据进行修改的时候,可能并不会得到想要的结果,因为当前线程正在运行的时候可能受到其他正在运行的线程影响,所以,为了得到正确的数据,此时应该让多个线程进行同步。
多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时,可能存在数据不同步的问题。加锁的多线程,其实就是存在多个正在运行的任务,但是同一时间只能够运行一个,其他的处于等待状态,只有当这个线程运行完以后才可以轮到它们。



考虑这样一种情况:一个列表里所有元素都是0,线程"set"从后向前把所有元素改成1,而线程"print"负责从前往后读取列表并打印。
那么,可能线程"set"开始改的时候,线程"print"便来打印列表了,输出就成了一半0一半1,这就是数据的不同步。为了避免这种情况,引入了锁的概念。
锁有两种状态——锁定和未锁定。每当一个线程比如"set"要访问共享数据时,必须先获得锁定;如果已经有别的线程比如"print"获得锁定了,那么就让线程"set"暂停,也就是同步阻塞;等到线程"print"访问完毕,释放锁以后,再让线程"set"继续。
经过这样的处理,打印列表时要么全部输出0,要么全部输出1,不会再出现一半0一半1的尴尬场面。

实例:

#!/usr/bin/python#coding: utf-8import threadingimport time# 自定义的线程类要继承自threading.Thread,要重写__init__和run两个方法,# run方法在线程类运行的时候会自动运行,不需要调用class MyThread(threading.Thread):    def __init__(self, threadName):        # 继承        threading.Thread.__init__(self)        self.threadName = threadName    def run(self):        print("Starting " + self.threadName)        # 获得锁,成功获得锁定后返回True        # 可选的timeout参数不填时将一直阻塞直到获得锁定        # 否则超时后将返回False        lock.acquire()        func(self.threadName, 1, 5)        # 释放锁        lock.release()        print("Exiting " + self.threadName)def func(name, delay, count):    while count:        time.sleep(delay)        count -= 1        print(name + "is running")# 创建线程锁lock = threading.Lock()thread1 = MyThread("thread - 1")thread2 = MyThread("thread - 2")# 启动线程thread1.start()thread2.start()print("Exiting Main Thread")


运行结果如下:

Starting thread - 1Starting thread - 2 Exiting Main Threadthread - 1is runningthread - 1is runningthread - 1is runningthread - 1is runningthread - 1is runningExiting thread - 1thread - 2is runningthread - 2is runningthread - 2is runningthread - 2is runningthread - 2is runningExiting thread - 2



0 0
原创粉丝点击