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
- python线程的同步
- Python多线程学习(二、线程的同步)
- Python多线程学习(二、线程的同步)
- python 线程的同步和互斥
- Python多线程学习(二、线程的同步)
- python线程的同步与互斥
- Python 线程同步
- Python 线程同步队列
- python线程同步方法
- python线程同步
- Python 线程同步
- Python简单线程同步
- Python线程同步--互斥锁
- python 线程同步
- Python 线程同步
- Python线程同步
- Python 线程同步 线程优先级
- python多线程与线程同步
- Ubuntu 安装JDK1.8
- android 中保证进程不被杀死
- Mysql启动不了报错Timeout error 磁盘满
- arm平台和相关的矩阵运算库
- MySQL最常用的几个基本SQL语句
- python线程的同步
- Target-IT elite
- C - 求绝对值(水题)
- 在DirectShow中支持DXVA 2.0
- 《Linux内核的设计与实现》读书笔记(三)---进程管理
- 网易面试题之暗黑字符串
- Mysql使用入门(二)支持的数据类型
- 禁止弹MessageBoxA.Dll
- 基础 python(三)关于string的几个tips