返回顶部
首页 > 资讯 > 后端开发 > Python >Python语法学习之线程的创建与常用方法详解
  • 500
分享到

Python语法学习之线程的创建与常用方法详解

2024-04-02 19:04:59 500人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录线程的创建与使用线程的创建 -threading线程对象的常用方法线程演示案例线程的问题线程的创建与使用 在python中有很多的多线程模块,其中 threading

线程的创建与使用

python中有很多的多线程模块,其中 threading 模块就是比较常用的。下面就来看一下如何利用 threading 创建线程以及它的常用方法。

线程的创建 -threading

函数名介绍举例
Thread创建线程Thread(target, args)

Thread 的动能介绍:通过调用 threading 模块的 Thread 类来实例化一个线程对象;它有两个参数: target 与 args (与创建进程时,参数相同)。target 为创建线程时要执行的函数,而 args 为是要执行这个函数时需要传入的参数。

线程对象的常用方法

接下里看一下线程对象中都有哪些常用的方法:

函数名介绍用法
start启动线程start()
join阻塞线程直到线程执行结束join(timeout=None)
getName获取线程的名字getName()
setName设置线程的名字setName(name)
is_alive判断线程是否存活is_alive()
setDaemon守护线程setDaemon(True)
  • start 函数:启动一个线程;没有任何返回值和参数。
  • join 函数:和进程中的 join 函数一样;阻塞当前的程序,主线程的任务需要等待当前子线程的任务结束后才可以继续执行;参数为
  • timeout:代表阻塞的超时时间。
  • getName 函数:获取当前线程的名字。
  • setName 函数:给当前的线程设置名字;参数为 name:是一个字符串类型
  • is_alive 函数:判断当前线程的状态是否存货
  • setDaemon 函数:它是一个守护线程;如果脚本任务执行完成之后,即便进程池还没有执行完成业务也会被强行终止。子线程也是如此,如果希望主进程或者是主线程先执行完自己的业务之后,依然允许子线程继续工作而不是强行关闭它们,只需要设置 setDaemon() 为 True 就可以了。

PS:通过上面的介绍,会发现其实线程对象里面的函数几乎和进程对象中的函数非常相似,它们的使用方法和使用场景几乎是相同的。

线程演示案例

单线程初始案例

演示 多线程之前 先看一下下面这个案例,运行结束后看看共计耗时多久

1、定义一个列表,里面写一些内容。

2、再定义一个新列表,将上一个列表的内容随机写入到新列表中;并且删除上一个列表中随机获取到的内容。

3、这里需要使用到 r andom 内置模块

代码示例如下:

# coding:utf-8


import time
import random


old_lists = ['罗马假日', '怦然心动', '时空恋旅人', '天使爱美丽', '天使之城', '倒霉爱神', '爱乐之城']

new_lists = []


def work():
    if len(old_lists) == 0:     # 判断 old_list 的长度,如果为0 ,则表示 该列表的内容已经被删光了
        return '\'old_list\' 列表内容已经全部删除'
    old_choice_data = random.choice(old_lists)      # random 模块的 choice函数可以随机获取传入的 old_list 的元素
    old_lists.remove(old_choice_data)               # 当获取到这个随机元素之后,将该元素从 old_lists 中删除
    new_choice_data = '%s_new' % old_choice_data    # 将随机获取到的随机元素通过格式化方式重新赋值,区别于之前的元素
    new_lists.append(new_choice_data)               # 将格式化的新的随机元素添加至 new_lists 列表

    time.sleep(1)


if __name__ == '__main__':
    strat_time = time.time()

    for i in range(len(old_lists)):
        work()

    if len(old_lists) ==0:
        print('\'old_lists\' 当前为:{}'.fORMat(None))
    else:
        print(('\'old_lists\' 当前为:{}'.format(old_lists)))

    if not len(new_lists) == 0:
        print(('\'new_lists\' 当前为:{}'.format(new_lists)))
    else:
        print('\'new_lists\' 当前为:{}'.format(None))

    end_time = time.time()
    print('运行结束,累计耗时:{} 秒'.format(end_time - strat_time))

运行结果如下:

从运行输出结果我们可以看到整个脚本运行共计耗时7秒,而且 new_lists 列表内的元素都经过格式化处理后加上了 _new ;不仅如此, 因为 random模块的choice函数 原因,new_lists 的内容顺序与 old_lists 也是不一样;每次运行顺序都会不一样,所以 old_lists 的顺序是无法得到保障的。

多线程演示案例

代码示例如下:

# coding:utf-8


import time
import random
import threading


old_lists = ['罗马假日', '怦然心动', '时空恋旅人', '天使爱美丽', '天使之城', '倒霉爱神', '爱乐之城']

new_lists = []


def work():
    if len(old_lists) == 0:     # 判断 old_list 的长度,如果为0 ,则表示 该列表的内容已经被删光了
        return '\'old_list\' 列表内容已经全部删除'
    old_choice_data = random.choice(old_lists)      # random 模块的 choice函数可以随机获取传入的 old_list 的元素
    old_lists.remove(old_choice_data)               # 当获取到这个随机元素之后,将该元素从 old_lists 中删除
    new_choice_data = '%s_new' % old_choice_data    # 将随机获取到的随机元素通过格式化方式重新赋值,区别于之前的元素
    new_lists.append(new_choice_data)               # 将格式化的新的随机元素添加至 new_lists 列表

    time.sleep(1)


if __name__ == '__main__':
    strat_time = time.time()

    print('\'old_lists\'初始长度为:{}'.format(len(old_lists)))	# 获取 old_lists 与 new_lists 最初始的长度
    print('\'new_lists\'初始长度为:{}'.format(len(new_lists)))
    thread_list = []        # 定义一个空的 thread_list 对象,用以下方添加每个线程

    for i in range(len(old_lists)):
        thread_work = threading.Thread(target=work)     # 定义一个线程实例化对象执行 work 函数,因为 work 函数没有参数所以不用传 args
        thread_list.append(thread_work)                 # 将 thread_work 添加进 thread_list
        thread_work.start()                             # 启动每一个线程

    for t in thread_list:   # 通过for循环将每一个线程进行阻塞
        t.join()

    if len(old_lists) ==0:
        print('\'old_lists\' 当前为:{}'.format(None), '当前长度为:{}'.format(len(old_lists)))
    else:
        print(('\'old_lists\' 当前为:{}'.format(old_lists)))

    if not len(new_lists) == 0:
        print('\'new_lists\' 当前长度为:{}'.format(len(new_lists)))
        print('\'new_lists\' 当前的值为:{}'.format(new_lists))
    else:
        print('\'new_lists\' 当前为:{}'.format(None))

    end_time = time.time()
    print('运行结束,累计耗时:{} 秒'.format(end_time - strat_time))

运行结果如下:

从运行的结果来看,我们初始的单线程任务耗时为 7秒,在使用多线程之后,仅耗时 1秒就完成了,大大的提高了我们的运行效率。

线程的问题

通过上面的练习,我们发现进程的使用方法几乎与进程是一模一样的。它们都可以互不干扰的执行程序,也可以使得主线程的程序不需要等待子线程的任务完成之后再去执行。只不过刚刚的演示案例中我们使用了 join() 函数进行了阻塞,这里可以吧 join() 去掉,看看执行效果。

与进程一样,线程也存在着一定的问题。

线程执行的函数,也同样是无法获取返回值的。

当多个线程同时修改文件一样会造成被修改文件的数据错乱的错误(因为都是并发去操作一个文件,特别是在处理交易场景的时候,需要尤为注意)。

到此这篇关于Python语法学习之线程的创建与常用方法详解的文章就介绍到这了,更多相关Python 线程创建内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python语法学习之线程的创建与常用方法详解

本文链接: https://lsjlt.com/news/117242.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python语法学习之线程的创建与常用方法详解
    目录线程的创建与使用线程的创建 -threading线程对象的常用方法线程演示案例线程的问题线程的创建与使用 在Python中有很多的多线程模块,其中 threading ...
    99+
    2024-04-02
  • Python语法学习之进程的创建与常用方法详解
    目录进程的创建模块 - multiprocessing创建进程函数 - Process进程的常用方法start 函数join 函数kill 函数 与 is_alive 函数进程的相关...
    99+
    2024-04-02
  • Python线程的创建与常用方法是什么
    这篇文章主要介绍“Python线程的创建与常用方法是什么”,在日常操作中,相信很多人在Python线程的创建与常用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python线程的创建与常用方法是什么...
    99+
    2023-06-30
  • Python语法学习之进程池与进程锁详解
    目录进程池什么是进程池进程池的创建模块 - multiprocessing创建进程池函数 - Pool进程池的常用方法apply_async 函数演示案例close 函数与 join...
    99+
    2024-04-02
  • Python学习之12个常用基础语法详解
    目录前言1.多个字符串组合为一个字符串2.字符串拆分为子字符串列表3.统计列表中元素的次数4.使用try-except-else-block模块5.使用枚举函数得到key/value...
    99+
    2024-04-02
  • Python学习之文件的创建与写入详解
    目录内置函数 - open 获取文件对象open() 函数利用文件对象进行创建与写入文件操作的写入模式文件对象的写入操作方法实战小案例在前面章节我们通过 os包学习了如何创建、读取一...
    99+
    2024-04-02
  • Python学习之循环方法详解
    目录for循环while循环拓展:列表推导式常见的推导式方法循环的继续与退出(continue与break)continue的使用break的使用循环实现九九乘法表什么是循环? &m...
    99+
    2024-04-02
  • kotlin 官方学习教程之基础语法详解
    kotlin 官方学习教程之基础语法详解Google 在今天的举行了 I/O 大会,大会主要主要展示内有容 Android O(Android 8.0)系统、Google Assistant 语音助手、Google 智能音箱、人工智能、机器...
    99+
    2023-05-31
    kotlin 教程
  • Python学习之线程池与GIL全局锁详解
    目录线程池线程池的创建 - concurrent线程池的常用方法线程池演示案例线程锁利用线程池实现抽奖小案例GIL全局锁GIL 的作用线程池 线程池的创建 - concurrent ...
    99+
    2024-04-02
  • Go语言学习之WaitGroup用法详解
    目录前言小试牛刀总览底层实现结构体AddDoneWait易错点总结前言 在前面的文章中,我们使用过 WaitGroup 进行任务编排,Go语言中的 ...
    99+
    2022-06-11
    GO 学习 go语言
  • Python学习之字典的常用方法总结
    目录字典添加与修改方法利用[]处理字典的内置函数update字典的内置函数setdefault关于字典的注意事项再强调尝试做一个小练习获取字典的key与value字典中的values...
    99+
    2024-04-02
  • Python学习之集合的常用方法总结
    目录什么是集合?集合与列表的区别集合的创建方法集合的增删改add函数update函数remove函数clear函数del方法删除集合关于集合的重要说明获取两个集合交、并、差集的函数d...
    99+
    2024-04-02
  • Python学习之列表常用方法总结
    目录列表(元组)基本操作符回顾len()函数在列表与元组上的使用列表(元组)之间的累加与乘法in和notin在列表(元组)中的用法列表常用方法append()函数insert()函数...
    99+
    2024-04-02
  • Python语法学习之正则表达式的使用详解
    目录正则表达式中的特殊字符正则表达式的使用正则小案例 - 1正则小案例 - 2正则小案例 - 3要想成功的进行字符串的匹配需要使用到正则表达式模块,正则表达式匹配规则以及需要被匹配的...
    99+
    2024-04-02
  • Go语言学习之context包的用法详解
    目录前言需求一需求二Context 接口emptyCtxvalueCtx类型定义WithValuecancelCtx类型定义cancelCtxWithCanceltimerCtx类型...
    99+
    2024-04-02
  • Go语言学习之反射的用法详解
    目录1. reflect 包1.1 获取变量类型1.2 断言处理类型转换2. ValueOf2.1 获取变量值2.2 类型转换3. Value.Set3.1 设置变量值3.2 示例4...
    99+
    2024-04-02
  • Go语言学习之数组的用法详解
    目录引言一、数组的定义1. 语法2. 示例二、数组的初始化1. 未初始化的数组2. 使用初始化列表3. 省略数组长度4. 指定索引值的方式来初始化5. 访问数组元素6. 根据数组长度...
    99+
    2024-04-02
  • Go语言学习之指针的用法详解
    目录引言一、定义结构体1. 语法格式2. 示例二、访问结构体成员三、结构体作为函数参数四、结构体指针总结引言 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义...
    99+
    2024-04-02
  • SpringMvc学习之旅与Thymeleaf的常用用法
     哈喽~大家好呀,这篇继续上篇的SpringMvc讲解与Thymeleaf的常用用法。  🥇个人主页:个人主页​​​​​              🥈 系列专栏:【Java框架】    &#...
    99+
    2023-10-09
    spring springMvc java springboot 学习
  • Android学习之Span的使用方法详解
    目录Span集合段落类Span其他Span展示效果小试牛刀小结Span集合 段落类Span BulletSpan 为段落开头增加项目符号并支持大小、颜色、弧度 span.append...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作