1.线程

Python中使用线程有两种方式:函数或者用类来包装线程对象。

1.函数式:调用thread模块中的start_new_thread()函数来产生新线程。

语法如下:

thread.start_new_thread(function,args[,kwargs])

参数说明:

function - 线程函数。

args - 传递给线程函数的参数,他必须是个tuple类型。

kwargs - 可选参数。

2.线程模块

Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。

thread 模块提供的其他方法:

threading.currentThread(): 返回当前的线程变量。

threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。

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

除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:

run():用以表示线程活动的方法。

start():启动线程活动。

join([time]):等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。

isAlive():返回线程是否活动的。

getName():返回线程名。

setName():设置线程名。

3.线程优先级队列( Queue)

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

Queue模块中的常用方法:

Queue.qsize() 返回队列的大小

Queue.empty() 如果队列为空,返回True,反之False

Queue.full() 如果队列满了,返回True,反之False

Queue.full 与 maxsize 大小对应

Queue.get([block[, timeout]])获取队列,timeout等待时间

Queue.get_nowait() 相当Queue.get(False)

Queue.put(item) 写入队列,timeout等待时间

Queue.put_nowait(item) 相当Queue.put(item, False)

Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号

Queue.join() 实际上意味着等到队列为空,再执行别的操作

2.多线程-threading

python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用

1.使用threading模块

单线程执行:

运行结果:

多线程执行:

运行结果:

说明:

1.可以明显看出使用了多线程并发的操作,花费时间要短很多

2.创建好的线程,需要调用start()方法来启动

3.主线程会等待所有的子线程结束后才结束

运行结果:

通过结果我们会发现主线程会等到子线程结束后结束

4.查看线程数量

我们可以通过用threading.enumerate()来查看线程的数量

运行结果:

5.threading注意点

1.线程执行代码的封装

通过上一小节,能够看出,通过使用threading模块能完成多任务的程序开发,为了让每个线程的封装性更完美,所以使用threading模块时,往往会定义一个新的子类class,只要继承threading.Thread就可以了,然后重写run方法

threading.Thread

Thread是threading模块中最重要的类之一,可以使用它来创建线程。有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入。

运行结果:

说明:

·python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。而创建自己的线程实例后,通过Thread类的start方法,可以启动该线程,交给python虚拟机进行调度,当该线程获得执行的机会时,就会调用run方法执行线程。

def__init__(self, group=None, target=None, name=None, args=(), kwargs={})

1.参数group是预留的,用于将来扩展;

2.参数target是一个可调用对象(也称为活动[activity]),在线程启动后执行;

3.参数name是线程的名字。默认值为“Thread-N“,N是一个数字。

4.参数args和kwargs分别表示调用target时的参数列表和关键字参数。

5.Thread类还定义了以下常用方法与属性:

1.Thread.getName()

2.Thread.setName()

3.Thread.name

用于获取和设置线程的名称。

Thread.ident

获取线程的标识符。线程标识符是一个非零整数,只有在调用了start()方法之后该属性才有效,否则它只返回None。

1.Thread.is_alive()

2.Thread.isAlive()

判断线程是否是激活的(alive)。从调用start()方法启动线程,到run()方法执行完毕或遇到未处理异常而中断 这段时间内,线程是激活的。

Thread.join([timeout])

调用Thread.join将会使主调线程堵塞,直到被调用线程运行结束或超时。参数timeout是一个数值类型,表示超时时间,如果未提供该参数,那么主调线程将一直堵塞到被调线程结束。

由于任何进程默认就会启动一个线程,我们把该线程称为主线程,主线程又可以启动新的线程,Python的threading模块有个current_thread()函数,它永远返回当前线程的实例。主线程实例的名字叫MainThread,子线程的名字在创建时指定,我们用LoopThread命名子线程。名字仅仅在打印时用来显示,完全没有其他意义,如果不起名字Python就自动给线程命名为Thread-1,Thread-2……

2.线程的执行顺序

运行结果:

说明

从代码和执行结果我们可以看出,多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runnable)状态,等待调度。而线程调度将自行选择一个线程执行。上面的代码中只能保证每个线程都运行完整个run函数,但是线程的启动顺序、run函数中每次循环的执行顺序都不能确定。

总结

1.每个线程一定会有一个名字,尽管上面的例子中没有指定线程对象的name,但是python会自动为线程指定一个名字。

2.当线程的run()方法结束时该线程完成。

3.无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。

4.线程的几种状态

6.多线程-共享全局变量

运行结果:

7.列表当做实参传递到线程中

运行结果:

总结:

·在一个进程内的所有线程共享全局变量,能够在不适用其他方式的前提下完成多线程之间的数据共享(这点要比多进程要好)

·缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)

python获取线程名称_Python-线程相关推荐

  1. python获取图片名称_python提取图像的名字*.jpg到txt文本的方法

    如下所示: # -*- coding:utf-8 -*- import sys sys.path.append('E:\\Anaconda\\libs') import os #os:操作系统相关的信 ...

  2. python 获取子线程状态_python线程状态

    python怎么判断线程的状态 python中如何在父线程中检测其子线程是否处于运行状态 子线程有一个方法 is_alive() 运行时会返回Bool值True python 在线程函数中如何实现线程 ...

  3. python 判断线程状态_Python 线程和进程

    前言 学编程,谁没有为线程折腾过啊. 目录 线程与进程 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程. 操作系统会为这些进程分配一些执行资源,例如内存空间等. 在进程中, ...

  4. python 判断线程状态_Python线程指南

    Python线程指南 本文介绍了Python对于线程的支持,包括"学会"多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例. 注意:本文基于Python2. ...

  5. python 线程池_Python线程池及其原理和使用(超级详细)

    系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即 ...

  6. python线程创建对象_Python线程下thread对象的用法介绍(附实例)

    本篇文章给大家带来的内容是关于Python线程下thread对象的用法介绍(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Thread对象 Thread类用于表示单独的控制 ...

  7. python多线程队列处理_Python线程和队列使用的一点思考

    Python线程和队列使用的一点思考 1. 斗哥采访环节请问为什么要使用线程? 答:为了提高程序速度,代码效率呀. 请问为什么要使用队列? 答:个人认为队列可以保证线程安全,实现线程间的同步,比较稳. ...

  8. python线程状态_Python线程

    1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...

  9. python 线程退出_python线程退出

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 如果某线程并未使用很多 io 操作, 它会在自己的时间片内一直占用处理器(和 g ...

  10. python线程状态_python 线程的五个状态

    当程序中包含多个线程时,CPU 不是一直被特定的线程霸占,而是轮流执行各个线程. 那么,CPU 在轮换执行线程的过程中,即从创建到消亡的整个过程,可能会历经 5 种状态,分别是新建.就绪.运行.阻塞和 ...

最新文章

  1. Windows的端口列表(转载)
  2. vim 语法高亮显示
  3. 【网络安全】无需SOCKS支持,帮助广大渗透测试人员建立一条隐蔽的通信信道
  4. OpenGL通过原图自动生成法线贴图
  5. 62 | 测一测 | 这些软件测试题目,你都掌握了吗?
  6. 高可用的 MFS 文件分布式系统(Drdb+heartbeat+MFS )
  7. A* a=new B ,会不会产生内存泄露了,露了B-A的部分?
  8. C#设置IP地址,启用禁用适配器
  9. leetcode求众数
  10. Windows映射网络驱动器
  11. 数字通信系统误码性能仿真分析
  12. 思翼FM30高频头蓝牙数传连接地面站远距离通信功能
  13. Android studio运行出错 compilation failed see the compiler error output for details.
  14. 如何进行App推广以及广告推送
  15. 明日之后到底要不要加营地?不加营地能玩吗?
  16. win10重装系统后连不上公司服务器,Win10电脑重装系统后不能上网怎么办?
  17. meizz (梅花雨)的一些珍藏代码奉献(转)
  18. 100%完美解决 mac系统不能使用su命令问题 —— sudo和su的区别
  19. EasyX全部函数及使用
  20. sdl+ffmpeg视频播放器

热门文章

  1. codemirror格式化json数据格式
  2. 利用FFmpeg将立体声转为单声道wav
  3. cmake:gcc-stack-protector
  4. linux命令 acc,sed linux 命令 在线中文手册
  5. android 获取wifi型号,android 获取连接WiFi的名称
  6. 程序崩溃的原因及处理方法
  7. 基于ssm智能停车场车位管理系统
  8. 在线音乐进入“人本主义”争夺时代
  9. c语言ddv_max,STC单片机自制贴片元件拆焊台MAX6675控温程序
  10. PN532开发指南(uart)