此类表示在单独的控制线程中运行的活动,有两种方法可以指定该活动,一是将可调用对象传递给构造函数,二是通过覆盖子类中的run()方法。

  如果你对线程不太理解,我们可以打个比方,把线程数看作车辆数,我们来完成一个简单的客运运输工作(以下为了方便理解,也加入相应注释)。

  更多threading模块函数和对象说明,可参考:https://www.cnblogs.com/leozhanggg/p/10317494.html

一、无线程:
示例:
import time
start = time.time()
people = 500 # 假设有500个人
def action(num):
global people
while people>0:
people -= 50 # 每次运输50人
print("车辆编号:%d, 当前车站人数:%d" %(num, people))
time.sleep(1) num = 1 # 车辆编号
action(num)
end = time.time()
print("Duration time: %0.3f" %(end-start))
运行结果:
C:\Python37\python.exe Y:/Project-python/threading/test.py
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
Duration time: 10.001 Process finished with exit code

二、单线程:
编码示例:
import threading
import time
start = time.time()
people = 500 # 假设有500个人
def action(num):
global people
while people>0:
people -= 50 # 每次运输50人
print("车辆编号:%d, 当前车站人数:%d" %(num, people))
time.sleep(1) num = 1 # 车辆编号
vehicle = threading.Thread(target=action, args=(num,)) # 新建车辆
vehicle.start() # 启动车辆
vehicle.join() # 检查到站车辆 end = time.time()
print("Duration time: %0.3f" %(end-start))
运行结果:
C:\Python37\python.exe Y:/Project-python/threading/test.py
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
Duration time: 10.001 Process finished with exit code
三、多线程(传递对象方式):
编码示例:
# -*- coding: utf-8 -*
import threading
import time people = 500 # 假设有500个人
def action(num):
global people
while people>0:
people -= 50 # 每次运输50人
print("车辆编号:%d, 当前车站人数:%d" %(num, people))
time.sleep(1) start = time.time()
vehicles = [] # 新建车辆组
for num in range(5):
vehicle = threading.Thread(target=action, args=(num,)) # 新建车辆
vehicles.append(vehicle) # 添加车辆到车辆组中 for vehicle in vehicles:
vehicle.start() # 分别启动车辆 for vehicle in vehicles:
vehicle.join() # 分别检查到站车辆
end = time.time()
print("Duration time: %0.3f" % (end-start))
运行结果:
C:\Python37\python.exe Y:/Project-python/threading/test.py
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
Duration time: 2.001 Process finished with exit code

四、多线程(覆盖子类方式)

编码示例:

# -*- coding: utf-8 -*
import threading
import time people = 500
class MyThread(threading.Thread):
def __init__(self, num):
super(MyThread, self).__init__()
self.num = num def run(self):
global people
while people > 0:
people -= 50
print("车辆编号:%d, 当前车站人数:%d " % (self.num, people))
time.sleep(1) start = time.time()
vehicles = [] # 新建车辆组
for num in range(5): # 设置车辆数
vehicle = MyThread(num) # 新建车辆
vehicles.append(vehicle) # 添加车辆到车辆组中
vehicle.start() #启动车辆 for vehicle in vehicles:
vehicle.join() # 分别检查到站车辆
end = time.time()
print("Duration time: %0.3f" % (end-start))

运行结果:

C:\Python37\python.exe Y:/Project-python/threading/test.py
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数:
车辆编号:, 当前车站人数: 车辆编号:, 当前车站人数:100车辆编号:, 当前车站人数: 车辆编号:, 当前车站人数:
Duration time: 2.003 Process finished with exit code

五、结果分析

  

  1. 通过结果不难发现,不使用线程类和使用单线程运行时间是一样的,因为我们正常执行一个脚本,本质上就是单线程。

  2. 创建多线程的两种方法运行时间也是一样的,因为最终都是交给Thread类来处理,自行选择即可。

  3. 多线程运行时间明显比单线程快的多,从理论上来说是和线程数成正比的,但是实际并非是线程越多越好,因为线程越多所消耗的资源也就越多。

六、有关该类的其他说明:

    a. 创建线程对象后,必须通过调用线程的start()方法启动其活动,这将在单独的控制线程中调用run()方法。

    b. 一旦线程的活动开始,线程就被认为是“活着的”,当run()方法终止时,它会停止活动,或者引发异常。

    c. 线程可以调用is_alive()方法测试是否处于活动状态,其他线程可以调用线程的join()方法,这将阻塞调用线程,直到调用其join()方法的线程终止。

    d. 线程有一个名称,这个名称可以传递给构造函数,并通过name属性读取或更改。

    e. 线程可以标记为“守护程序线程”,这个标志的意义在于,当只剩下守护进程线程时,整个Python程序都会退出,可以通过守护程序属性设置该标志。

----- 转载请注明原作,谢谢:https://www.cnblogs.com/leozhanggg/p/10335098.html

Python-Thread(通俗易懂)的更多相关文章

  1. TLS 与 python thread local

    TLS 先说TLS( Thread Local Storage),wiki上是这么解释的: Thread-local storage (TLS) is a computer programming m ...

  2. Python Thread related

    1.Thread.join([timeout]) Wait until the thread terminates. This blocks the calling thread until the ...

  3. python thread的join方法解释

    python的Thread类中提供了join()方法,使得一个线程可以等待另一个线程执行结束后再继续运行.这个方法还可以设定一个timeout参数,避免无休止的等待.因为两个线程顺序完成,看起来象一个 ...

  4. 【Python@Thread】queue模块-生产者消费者问题

    python通过queue模块来提供线程间的通信机制,从而可以让线程分项数据. 个人感觉queue就是管程的概念 一个生产者消费者问题 from random import randint from ...

  5. 【Python@Thread】Semaphore&糖果机

    信号量适用与多线程竞争有限资源的情况. from atexit import register from time import ctime, sleep from threading import ...

  6. 【Python@Thread】锁示例

    当出现竞态条件时候,即在同一个时刻只有一个线程可以进入临界区,需要使用同步. 常见的同步原语有两种:锁/互斥,信号量. 锁是最简单,最低级的机制. 首先看一个不使用锁时候的多线程示例: from at ...

  7. 【Python@Thread】threading模块

    theading模块的Thread类 属性: name 线程名 ident 线程标识符 daemon  布尔值,标示是否为守护线程 方法: __init__(target=None, name=Non ...

  8. 【Python@Thread】thread模块

    一.关于Python多线程 Python解释器中可以同时运行多个线程,但是再任意时刻只能有一个线程在解释器运行. Python虚拟机的访问是由全局解锁器(GIL)控制的,由GIL保证同时只有一个线程的 ...

  9. Python thread local

    由于GIL的原因,笔者在日常开发中几乎没有用到python的多线程.如果需要并发,一般使用多进程,对于IO Bound这种情况,使用协程也是不错的注意.但是在python很多的网络库中,都支持多线程, ...

  10. test for python thread

    #!/usr/bin/python # -*- coding: UTF-8 -*- import thread import time # 为线程定义一个函数 def print_time(threa ...

随机推荐

  1. 装了anaconda之后如何设置anaconda、python环境变量

    装了anaconda之后如何设置anaconda.python环境变量 1.装了anaconda之后如何设置anaconda环境变量 参考 https://www.cnblogs.com/avivi/ ...

  2. ubuntu18安装网易云音乐

    1.打开ubuntu软件搜索网易云安装 2.解决ubuntu18.04下网易云音乐打不开的问题 修改/etc/sudoers文件 sudo vi /etc/sudoers 在最后增加一行: usern ...

  3. QC3.0充电标准

  4. Ubuntu-18.04.2-几个启动错误解决办法

    问题如图: 这里三个问题: 1. piix4_smbus: SMBus Host controller not enabled.(i2c_piix4模块所致,因为系统找不到这个模块,所以报错) 解决办 ...

  5. django1.4 简单事例 ,根目录下templates

    django发展很快,但是有的是用的老版本,比如我现在看到一个项目,它用的是 Django1.4,而且app不是创建在了项目的根目录下,这样,它的Setting中设置就会不一样,若是设置错误,就会找不 ...

  6. iTrash for Mac(卸载工具)破解版含注册机

    iTrash for Mac是一款专为Mac用户打造非常好用的卸载工具,itrash mac版简单好用,只需要把需要卸载的程序的拖拽到iTrash Mac版窗口内就可以删除应用程序.现为大家带来itr ...

  7. req和resp常用的方法

    req:  1. setAttribute()在Request域中存储数据 2. setCharacterEncoding()设置请求参数的编码方式,只对post请求有效 3. getMethod() ...

  8. [随笔][Java][总结][java 类型系统]

    java 的类型系统大体分为两类,对象和基本类型.java使用静态类型检查来保证类型安全.每个变量在使用之前需要声明.非静态类型的语言不要求变量在使用之前进行声明. 基本数据类型 java的基本类型不 ...

  9. 用户id,组id和文件访问权限

    实际用户ID和实际组ID:标示了我们究竟是谁,这两个字段在登录时取自口令文件中的登录项 有效用户ID和有效组ID以及附属组ID:决定了我们的文件的访问权限(通常有效用户ID等于实际用户ID,有效组ID ...

  10. tomcat配置ssl证书

    1.server.xml  打开已经注释掉的代码 然后添加证书地址 <Connector SSLEnabled="true" clientAuth="want&qu ...