python之threading模块简单讲解和实例演示

import threading

在处理一些程序时为了节约时间,可以使用多线程的方式,

让其并发去执行,从而节约时间,

(注意python其实是伪多线程,其实是以我们感觉不到的速度每行代码都按照相同时间执行)

Lock

当多线程同时对一个变量进行修改操作的时候,那么可能会出现混乱,

因为其是并发(算是吧)而行,

(所以当两个赋值时间相对接近时那么其容易出现混乱)

所以我们得创建锁,

让其上一个线程赋值结束,

下一个赋值再继续

threading.Lock() 创建锁

是可用的最低级的同步指令。

Lock处于锁定状态时,不被特定的线程拥有。

Lock包含两种状态--锁定和非锁定,以及两个基本的方法

可以认为Lock有一个锁定池,当线程请求锁定时,将线程至于池中,直到获得锁定后出池。

池中的线程处于状态图中的同步阻塞状态

acquire(blocking=True,timeout=-1)

使线程进入同步阻塞状态,尝试获得锁定

blocking:为True时,将阻塞直至锁变成unblocked,然后设置它的状态为locked并返回True。

为False时,将不会阻塞。如果阻止设置为True的调用将被阻止,请立即返回False;否则,将锁定设置为锁定并返回True。

锁定

release()

释放一把锁,这可以从任何线程调用,而不仅仅是已经获得锁的进程

---------------------------------------------------------

Thread

对某段代码实行多线程,

线程表示其里面的代码同时进行,

也就是说上下两个代码同时进行,

当执行完本条代码就会去执行父程序代码,

所以这样就可能会出现混乱,

所以我们得设置join让其把所有子进程执行完,

再执行父进程

threading.Thread(group=None,target=None,name=None,args=(),kwargs={},*,daemon=None)

线程类,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run()

group:线程组,目前还没有 实现

target: 要执行的方法,就是要执行的程序

是将被run()方法调用的可调用对象。默认为None,表示不调用任何东西

name:线程的名字,默认情况下以Thread-N的形式构造一个唯一的名字,N是一个小的十进制整数

args:给调用程序传入的值()

kwargs:给程序传入的值,默认为{}

Thread.name

线程名

Thread.ident

线程的标识符

Thread.daemon

布尔标志,表示这个线程是否是守护线程

start()

开始线程活动

isAlive()

返回线程是否正在运行。

get/setName(name)

获取/设置后台线程(默认前台线程False)

现在使用thread.name属性,或者在实例化过程中传递该属性

is/setDaemon(bool)

获取/设置是否守护进程。

初始值从创建该线程的线程继承

并没有非守护线程仍在运行时,程序将终止

已经弃用

现在使用thread.daemom属性

setDaemon(True)

(将线程声明为守护进程,必须在start()方法调用之前设置,如果不设置为守护线程程序会被无限挂起。

字线程启动后,父线程也继续执行,当父线程执行完最后一条语句后,没有等待子进程,直接就退出了,同时子线程也一同结束)

join([timeout])

直至启动的线程终止之前一直挂起;除非给出了timeout,否则会一直阻塞

也就是等上面的程序都执行完了,再执行下面的程序

(对于一些程序,可以用此方法来解决数据混乱问题,但是其需要一次次关闭,很浪费时间)

(理解线程:程序先上下执行,如果遇到循环则丢给第二个线程来执行)

-----------------------------------------------------------------

Condition

条件变量,通过与一个锁关联。需要在多个Contidion中共享一个锁时,可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个RLock实例

可以认为,除了Lock带有的锁定池外,Condition还包含一个等待池,池中的线程处于状态图中的等待阻塞状态,直到另一个线程调用notify()/notifyAll()通知;得到通知后线程进入锁定池等待锁定

构造方法:

Condition([lock/rlock])

wait([timeout]): 调用这个方法将使线程进入Condition的等待池等待通知,并释放锁。使用前线程必须已获得锁定,否则将抛出异常。

notify(): 调用这个方法将从等待池挑选一个线程并通知,收到通知的线程将自动调用acquire()尝试获得锁定(进入锁定池);其他线程仍然在等待池中。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常。

notifyAll(): 调用这个方法将通知等待池中所有的线程,这些线程都将进入锁定池尝试获得锁定。调用这个方法不会释放锁定。使用前线程必须已获得锁定,否则将抛出异常

----------------------------------------------------------------------------

threading.currentThread()

返回当前的线程变量

threading.enumerate()

返回一个包含正在运行的线程的List

正在运行指线程启动后,结束前,不包括启动前和终止后的线程

threading.activeCount()

返回正在运行的线程数量,与len(threading.enumerate())有相同的效果

threading.TIMEOUT_MAX

设置threading全局超时时间

----------------------------------------------------------------------------------------------------------------------------------------------------

import threading 导入模块

lock=threading.Lock() 创建锁

a=0

thre=[]

def qwer():

  lock.acquire() 对其锁定

  global a 设置全局变量

  a+=1

  print(a)

  lock.release() 对其解锁

for i in range(10):

  t=threading.Thread(target=qwer) 创建线程

  thre.append(t) 加入列表

  t.start() 启动线程

for t in thre:

  t.join() #等什么执行完了再执行下面的

  print(6666666666)

时间: 2024-10-09 23:47:43

python之threading模块简单讲解和实例演示的相关文章

Python之threading模块简单使用

下面的代码来自<Python核心编程>(第二版)一书. threading模块对象 说明 Thread 表示一个线程的执行的对象 Lock 锁原语对象(跟thread模块里的锁原语对象相同) RLock 可重入锁对象.使单线程可以再次获得已经获得了的锁(递归锁定) Condition 条件变量对象能让一个线程停下来,等待其他线程满足了某个"条件".如,状态的改变或值得改变 Event 通用的条件变量,多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活 Sem

python 的threading模块

其中Thread类 是你主要的线程类,可以创建进程实例.该类提供的函数包括: getName(self) 返回线程的名字 isAlive(self) 布尔标志,表示这个线程是否还在运行中 isDaemon(self) 返回线程的daemon标志,将线程放入后台执行 join(self, timeout=None) 程序挂起,直到线程结束,如果给出timeout,则最多阻塞timeout秒,主线程需等待子线程完成 run(self) 定义线程的功能函数 setDaemon(self, daemon

Python 多线程threading模块

首先,我们在了解多线程时需要理解的就是什么是多线程,按照官方的解释就是:多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术. 在我自学到这里的时候,通过会在想进程和线程到底是有什么区别,我的理解就是: 进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,一个进程可以包含多个线程. 下面就以简单的例子来加强我们对python 线程的理解. 默认情况下,我们在没有启动线程的时候,可以看一下程序总的运行时间,应该是每个函数

python中threading模块详解(一)

python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thread模块更高层的API来提供线程的并发性.这些线程并发运行并共享内存. 下面来看threading模块的具体用法: 一.Thread的使用 目标函数可以实例化一个Thread对象,每个Thread对象代表着一个线程,可以通过start()方法,开始运行. 这里对使用多线程并发,和不适用多线程并发做

审核流(3)低调奢华,简单不凡,实例演示-SNF.WorkFlow--SNF快速开发平台3.1

下面我们就从什么都没有,结合审核流进行演示实例.从无到有如何快速完美的实现,然而如此简单.低调而奢华,简单而不凡. 从只有数据表通过SNF.CodeGenerator代码生成器快速生成单据并与审核流进行结合案例. 现在我只有这样一个表如下:(下面介绍单表,多表原理是一样的) 1.审核流结合代码生成器快速实现 1.用代码生成器生成单据(选择启用审核流) 之后点击“生成“并把对应代码拷贝到相应的位置,执行脚本把菜单预制进去,详见“06.SNF.CodeGenerator代码生成器使用说明.docx”

再看python多线程------threading模块

现在把关于多线程的能想到的需要注意的点记录一下: 关于threading模块: 1.关于 传参问题 如果调用的子线程函数需要传参,要在参数后面加一个","否则会抛参数异常的错误. 如下: 1 for i in xrange(5): 2 threads.append(threading.Thread(target=worker,args=(i,))) 2.关于join()阻塞 join()方法一旦被调用,这个线程就会被阻塞住,等其他线程执行完才执行自身.当我们在主线程A中,创建了n个子线

python多线程-threading模块

threading 是我们常用的用于 python 多线程的模块,其功能更加丰富.下面我们就来开始学习这个模块. 同样的,我这里声明一样我使用的版本是 python2.7,不同版本直接可能存在差异. 老规矩,使用 help() 函数获取帮助文档,看看里面有什么内容. threading 模块中提供了一个 thread 的类,注意不要和 thread 模块搞混了,两者差别还是很大的.thread 这个类可以实例化一个对象,每个对象代表一个线程,可以调用其中的 run() 方法来开启一个线程的运行.

python基础===socket模块的讲解(转)

一.网络知识的一些介绍 socket 是网络连接端点.例如当你的Web浏览器请求www.jb51.net上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.jb51.net的Web服务器主机,Web服务器也对来自的请求在一个socket上进行监听.两端使用各自的socket来发送和 接收信息. 在使用的时候,每个socket都被绑定到一个特定的IP地址和端口.IP地址是一个由4个数组成的序列,这4个数均是范围 0~255中的值(例如,220,176,36,76):端口数值的取

Python中的模块简单认识

将自己定义的方法,变量存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件称为模块. 细说的话,模块可以分为四个通用类别: 1 使用python编写的.py文件(自定义模块) 2 已被编译为共享库或DLL的C或C++扩展 3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包) 4 使用C编写并链接到python解释器的内置模块 内置模块: time,os,sys,json,xml,logging(日志模块),re(正则表达式模块)等 导入模块