此类表示在单独的控制线程中运行的活动,有两种方法可以指定该活动,一是将可调用对象传递给构造函数,二是通过覆盖子类中的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. vue 配合vue-resource调用接口,获取数据

    1.先用node+express+mysql简单配置一下后台 const express = require('express');const mysql = require('mysql');con ...

  2. STL——string

    C++之string类型详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个泛型类出现,他集成的操作函 ...

  3. linux配置服务器

    梳理一下这次配置服务器的思路. 1,挂载磁盘 Java和neigx上传到根目录下,tomcat放在data目录下,数据库新建文件夹也在data下, 2,配置环境变量 3,nginx修改域名 4,数据库 ...

  4. scrapy基本使用

    Scrapy笔记 安装scrapy框架 安装scrapy: 通过pip install scrapy 如果是在Windows上面,还需要安装pypiwin32,如果不安装,那么以后运行scrapy项目 ...

  5. 【转】Cookie/Session机制详解

    Cookie/Session机制详解   会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息 ...

  6. [Java Web学习]Tomcat启动时报war exploded: Error during artifact deployment

    报错:Artifact FirstWeb:war exploded: Error during artifact deployment. See server log for details. SEV ...

  7. 在Unity 3D中加入Image图片

    在Unity 3D中加入Image图片,我在刚开始是加不进去的,为什么呢?因为没有图片,图如下: 原因就是我们没有把图片设置为Script,图片的格式还是默认的那个,这只能作为贴图使用.我们将图片进行 ...

  8. 【学习】C++多态机制

    多态:静态(早绑定) 在编译阶段和链接就能确定功能调用的函数.     动态(晚绑定) 在程序运行时根据需要的功能确定调用的函数. 实现晚绑定就要定义虚函数,使用虚函数则会用到基类指针. 继承基类虚成 ...

  9. python基础——2、python应用(随机、异常)——(YZ)

    本次的内容为python的应用,关于随机.异常的应用,均多应用列表. 习题一 1.初始化一个数据集,包括5-10位同学的成绩数据(数据类型不限),数据格式如下: 学号 姓名 Java C语言 Pyth ...

  10. BigData_Jia

    #include <stdio.h> #include <string.h> #define MaxSize 10000 int n1, n2, i, k, times; ch ...