一.线程的调用

1.无参

def run_01():
for i in range(6, 10):
print("test01", i)
time.sleep(1) th_01 = threading.Thread(target=run_01) # 创建线程
th_01.start() # 启动线程 for i in range(0, 5):
print("main", i)
time.sleep(1)

threading中最主要的类就是Thread,我们可通过实例化Thread类来创建一个子线程,target参数为运行的事件。

start()方法为启动线程,线程运行结束或报异常时自动会结束线程。

程序默认在主线程上运行,不做任何操作的话,子线程和主线程是同步进行的。

2.有参

def run_01(a):
for i in range(6, 10):
print("test01", i)
time.sleep(1) th_01 = threading.Thread(target=run_01, args=("test",)) # 创建线程
th_01.start() # 启动线程

若运行的事件有参数时,我们可通过args传入一个元组入参,也可通过kwargs传入字典类型。

def run_01(a):
for i in range(6, 10):
print("test01", i)
time.sleep(1) th_01 = threading.Thread(target=run_01, kwargs={"a": "test"}) # 创建线程
th_01.start() # 启动线程

key值要与参数值保持一致。

3.多参

def run_01(a, b):
for i in range(6, 10):
print("test01", i)
time.sleep(1) th_01 = threading.Thread(target=run_01, args=(1, 2)) # 创建线程
# or
# th_01 = threading.Thread(target=run_01, kwargs={"a": "test", "b": 1}) # 创建线程
th_01.start() # 启动线程

和单个入参差不多,多传入一个参数即可。

二.设置线程名称,获取线程状态

1.子线程名称默认是Thread-1,Thread-2.....,我们可通过Thread类中name属性设置线程名,

def run():
for i in range(0, 5):
print(i) thread = threading.Thread(target=run, name='test') # name设置线程名
print(thread.name, thread.getName()) # name,getname()方法获取线程名

通过name属性和getName()方法获取线程名。修改/设备线程名也可通过setName()方法设置。

thread = threading.Thread(target=run, name='test')  # name设置线程名
thread.setName("updateThreadName")
print(thread.name, thread.getName()) # name,getName()方法获取线程名

2.is_alive()为获取线程当前的运行状态

def run():
for i in range(0, 5):
print(i) thread = threading.Thread(target=run, name='test') # name设置线程名
thread.start()
bol = thread.is_alive() # 为true时表示正在运行,为false时停止运行
print(bol)

三.主/子线程执行顺序

1.默认情况下主/子线程会同时执行,主线程会等待子线程结束后再结束。

def run():
for i in range(0, 5):
print("thread", i)
time.sleep(2) if __name__ == '__main__':
thread = threading.Thread(target=run)
thread.start()
for i in range(5, 10):
print("main", i)
time.sleep(1)

2.Thread类中有个daemon属性可控制执行结果

if __name__ == '__main__':
thread = threading.Thread(target=run,daemon=True)
thread.start()
for i in range(5, 10):
print("main", i)
time.sleep(1)

创建子线程时我们将daemon设置为True,可以看出主线程结束后子线程也会结束运行,

不会等待子线程结束后再结束。也可通过setDaemon()方法设置。

if __name__ == '__main__':
thread = threading.Thread(target=run)
thread.setDaemon(True)
thread.start()
for i in range(5, 10):
print("main", i)
time.sleep(1)

四.join()用法

1.join()为堵塞主线程执行,优先执行子线程,等子线程执行完后再去执行主线程。

def run():
for i in range(0, 5):
print("thread1", i)
time.sleep(1) def run2():
for i in range(0, 5):
print("thread2", i)
time.sleep(1) if __name__ == '__main__':
thread = threading.Thread(target=run)
thread2 = threading.Thread(target=run2)
thread.start()
thread.join() # 开始堵塞主线程,只执行thread线程
thread2.start() for i in range(5, 10):
print("main", i)
time.sleep(1)

2.join(timeout=None)中timeout参数

timeout默认为None,可传递秒数,设置堵塞主线程的时间,timeout秒后不管子线程有没有运行完都会执行主线程。

thread.join(timeout=2.0)

五.Event()方法的使用

我们都知道一个进程有多个线程,多个线程之间的资源是共享的,那么如果多个线程去修改同

一个资源数据,就会出现数据错乱的情况。Event类可以去堵塞线程的运行,我们先来看下Event()的几个方法。

1.实例化Event()类

event = threading.Event()

Event()中有个_flag的私有属性,默认为false,表示堵塞

2.wait()调用后表示开始堵塞

event.wait(timeout=2.0)  # 调用该方法后,该线程会被堵塞,timeout为堵塞时间

3.set()方法设置flag为true,表示结束堵塞

event.set()  # 设置self._flag = True

4.清除设置,flag值恢复false,继续堵塞

event.clear()  # self._flag = False

5.is_set()查看flag的值

print(event.is_set())  # 查看当前_flag的值

6.实例

import threading
import time def run(event):
print("当前flag的值", event.is_set())
event.wait() # 开始堵塞
for i in range(1, 6):
print(i)
time.sleep(1)
if event.is_set() == False:
break event = threading.Event() # self._flag = False
thread = threading.Thread(target=run, args=(event,))
thread.start()
print("\n开始堵塞2s")
time.sleep(2)
event.set() # 设置self._flag = True
print("结束堵塞,运行2s")
time.sleep(2)
print("结束运行,跳出for循环")
event.clear() # self._flag = False

解析:

上述中,子线程执行到event.wait()时就开始进行堵塞,主线程等待2s后调用set()方法使子线程继续运行,

子线程循环两次后主线程调用clear()设置flag值为false,子线程if判断跳出循环,运行结束。

文章来源:https://www.cnblogs.com/lihongtaoya/ ,请勿转载

线程(Thread)基本用法的更多相关文章

  1. 一个线程中lock用法的经典实例

    /* 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 作者:http://h ...

  2. C#线程Thread类

    在System.Threading 命名空间下,包含了用于创建和控制线程的Thread 类.对线程的常用操作有:启动线程.终止线程.合并线程和让线程休眠等. 1 启动线程 在使用线程前,首先要创建一个 ...

  3. Lua 学习笔记(九)协同程序(线程thread)

    协同程序与线程thread差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和命令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的 ...

  4. java 线程 Thread 使用介绍,包含wait(),notifyAll() 等函数使用介绍

    (原创,转载请说明出处!谢谢--http://www.cnblogs.com/linguanh/) 此文目的为了帮助大家较全面.通俗地了解线程 Thread 相关基础知识! 目录: --线程的创建: ...

  5. Android 线程Thread的2种实现方法

    在讲解之前有以下三点要说明: 1.在Android中有两种实现线程Thread的方法: ①扩展java.long.Thread类: ②实现Runnable()接口: 2.Thread类是线程类,它有两 ...

  6. Java 四种线程池的用法分析

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  7. Android线程之基本用法

    一: 在android中有两种实现线程thread的方法: 一种是,扩展java.lang.Thread类 另一种是,实现Runnable接口 二: Thread类代表线程类,它的两个最主要的方法是: ...

  8. 线程(thread)

    线程(thread): 现代操作系统引入进程概念,为了并发(行)任务 1.进程之间的这种切换代价很高 2.通信方式的代价也很大基本概念: 1.线程是比进程更小的资源单位,它是进程中的一个执行路线(分支 ...

  9. Java线程Thread的状态解析以及状态转换分析 多线程中篇(七)

    线程与操作系统中线程(进程)的概念同根同源,尽管千差万别. 操作系统中有状态以及状态的切换,Java线程中照样也有. State 在Thread类中有内部类 枚举State,用于抽象描述Java线程的 ...

  10. Asp.Net任务Task和线程Thread

    Task是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程.任务(Task)是架构在线程之上的, ...

随机推荐

  1. KingbaseES V8R3 备份恢复案例之--单实例环境sys_rman脚本备份案例

    案例说明: sys_rman是KingbaseES数据库的物理备份工具,支持数据库的全备和增量备份,由于sys_rman工具使用需要配置多个参数,对于一般用户使用不是很方便.为方便用户在Kingbas ...

  2. C#/VB.NET 在Word文档中插入分页符

    分页符是分页的一种符号,上一页结束以及下一页开始的位置.通查用于在指定位置强制分页.本文将分为两部分来介绍如何在Word文档中插入分页符.并附上C#/VB.NET以供参考,详情请阅读以下内容. 在特定 ...

  3. c语言字符串比较与bool型

    c++字符串string,定义的变量,能够通过比较符号,直接进行比较. 而c语言则不能通过char数组定义的变量,来直接比较.应用下面的方法: #include <string.h> in ...

  4. k8s控制器和Pod Template的关系

    Pod 本身并不能自愈(self-healing).如果一个 Pod 所在的 Node (节点)出现故障,或者调度程序自身出现故障,Pod 将被删除:同理,当因为节点资源不够或节点维护而驱逐 Pod ...

  5. google浏览器个人常用快捷键

    分享一下个人常用快捷键. 说明:字母排序规则遵循字母表(a->z) 快捷键 介绍 ctrl+0 恢复页面到100% ctrl+数字(1~9) 切换至序号对应的标签页 ctrl+d 将当前标签页添 ...

  6. 分布式存储系统之Ceph基础

    Ceph基础概述 Ceph是一个对象式存储系统,所谓对象式存储是指它把每一个待管理的数据流(比如一个文件)切分成一到多个固定大小的对象数据,并以其为原子单元完成数据的存取:对象数据的底层存储服务由多个 ...

  7. P7114 [NOIP2020] 字符串匹配 (字符串hash+树状数组)

    好多题解用的扩展KMP(没学过,所以不用这种方法). 我们按照题目要求记F(s)表示s串的权值,可以预处理出前缀权值(用于A)和后缀权值(用于C),枚举AB的长度i=2~n-1,不需要分开枚举,我们只 ...

  8. 《基于Apache Flink的流处理》读书笔记

    前段时间详细地阅读了 <Apache Flink的流处理> 这本书,作者是 Fabian Hueske&Vasiliki Kalavri,国内崔星灿翻译的,这本书非常详细.全面得介 ...

  9. 记一次 .NET 某电子病历 CPU 爆高分析

    一:背景 1.讲故事 前段时间有位朋友微信找到我,说他的程序出现了 CPU 爆高,帮忙看下程序到底出了什么情况?图就不上了,我们直接进入主题. 二:WinDbg 分析 1. CPU 真的爆高吗? 要确 ...

  10. ABC260 作战总结

    ABC260 作战总结 今后开始写一些模拟赛外的其他比赛的总结(也许有题解?). 开场点到另一场\(\text{ARC}\)去了,耽误了点时间,切完前四题发现已经过了\(37\)分钟了,看来自己读题+ ...