我的编程空间,编程开发者的网络收藏夹
学习永远不晚

浅析Python中线程以及线程阻塞

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

浅析Python中线程以及线程阻塞

本文所依赖的环境为:

进程和线程的概念

进程概念

我们想运行一个程序,首先会将该程序从存储介质上通过IO总线加载进内存中,而后再通过cpu进行调度。这个时候,我么么将这个正在运行的程序称之为进程,它有内存地址、内存空间、数据栈等等信息,进程之间通信一般称之为IPC,常见的方法有 管道、消息队列、套接字等。

线程概念

而线程则不同,线程是在进程中运行的,一个进程至少有一个线程。在单个cpu中,同一时刻一个进程只有一个线程在工作,其他则被挂起,也称之为睡眠。由于线程属于进程,所以会共享进程的内存信息。线程之间通信不仅可以使用共享内存来通信,依然可以使用 如 管道、消息队列、套接字等。

线程优缺点

多线程是一种并发方式,优点为可以同时执行多个任务,用于提升时间和效率。

比如,我们想写一个python服务器下载电影,一次只能下载一部,若我们使用多线程后,可以一次"同时"下载n部,从而提升了效率。

但是有些事多线程不能做的,并发冲突是其中一种。比如掘金点赞功能,如果没有对点赞这个变量进行并发控制,可能会出现数据不一致的情况。

在python中如何使用线程

在使用python写多线程之前,先来看一个小案例,假设我们使用python写了一个下载电影的程序。

import time

def downloadMovie(i):
    print("%s 开始下载编号为%s电影中。。。" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), str(i)))
    time.sleep(5)
    print("%s 编号为%s电影下载完毕" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), str(i)))

def main():
    for i in range(5):
        downloadMovie(i)

if __name__ == '__main__':
    main()

我们假设模拟下载电影的一个程序,下载过程使用time.sleep代替。在没有使用多线程的时候,它的执行过程如下:

可以看到,它是顺序执行的,需要等上一部下载完毕,才能开始下载下一部。

如果使用线程来做该需求呢? 我们可以这样来写:

import time
import threading

def downloadMovie(i):
    print("%s 开始下载编号为%s电影中。。。" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), str(i)))
    time.sleep(5)
    print("%s 编号为%s电影下载完毕" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), str(i)))

def main():
    for i in range(5):
        t = threading.Thread(target=downloadMovie,args=(i,))
        t.start()

if __name__ == '__main__':
    main()

上述代码,在原始代码基础上,我们引入了threading库,在循环中使用Thread来做线程的实例化对象,我们需要传入targetargstarget需要传入函数名称,args需要传入参数,注意这里参数需要传入可迭代的对象,所以当只有一个参数的时候,也需要在后面加一个,。最后使用start方法让其开始执行。

运行后的效果如下:

可以发现,我们程序几乎同步的打印下载开始,也几乎同时打印下载完毕。

总结起来发现,我们线程启动一个线程,是不是非常简单呢?只需要引入threading模块,定义Thread来做对象,最后使用start()运行即可。

线程阻塞也很重要

线程直接跑就完了呗,为什么还需要阻塞呢?我们这里做一个简单的需求:上面的代码改改,我们下载完视频后,要压缩一下,由于只讨论线程,所以就只用print代替操作,我们可以这样操作:

在上面的基础上,我们增加了2个步骤,1: 是将下载好的文件放入列表fileList中,2. 最后开始遍历fileList文件,进行压缩,最后打印一个压缩完毕,看起来没什么问题吧?

那我们来运行一下一下呢?

额。。。这个很显然不符合我们的预期,我们还没下载文件完毕,怎么就开始压缩了呢,而且压缩完毕了,再输出的文件下载完毕,这是为什么呢?

这是因为线程在启动后,如果我们不去设置阻塞,他就会一直执行下去,就拿我们刚才的案例来看,我们可以将其理解为:

看上图,我们启动线程后,它就放在后台了,我们就立马执行遍历fileList步骤,但是这个时候恰恰fileList是空的,所以我们压缩了空文件,压缩完毕后,文件才下载完毕。

这个时候我们就需要等线程执行完毕之后,再执行下面的语句了,否则执行完了没意义,所以这个时候就需要引入线程阻塞了,我们需要将下载的线程全部执行完毕后,再开始压缩文件,只需要线程增加一个join方法即可,代码修改如下:

在原先的基础上,我们需要先定义一个线程池,用于放已经执行了的线程,而后再遍历该线程池,每一个都设置阻塞,这样就会等所有线程都执行完毕了,再进行后面的操作,由于我们后面是压缩需要用到前面的结果,所以阻塞是必不可少的,程序执行结果为:

这个流程图可以理解为这样的:

现在你知道阻塞有什么用了吧。

总结

今天介绍了一下python的多线程,这里只是简单的使用threading库,在python中,多线程的库不仅于此,还有threadQueue等。最后举了一个很简单的例子来说明线程阻塞的重要性。

以上就是浅析Python中线程以及线程阻塞的详细内容,更多关于Python线程的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

浅析Python中线程以及线程阻塞

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

浅析Python中线程以及线程阻塞

这篇文章主要为大家简单介绍一下Python中线程以及线程阻塞的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
2023-05-17

python线程阻塞模式有哪些

在Python中,有几种常见的线程阻塞模式,包括:1. join()方法:在主线程中调用某个线程的join()方法,主线程会等待该线程执行完毕后再继续执行。2. Lock(锁):使用Lock对象可以实现线程的阻塞和解锁。线程可以通过acqu
2023-08-15

Java线程同步中怎么排除阻塞

这篇文章将为大家详细讲解有关Java线程同步中怎么排除阻塞,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java线程同步由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访
2023-06-17

Python多线程以及多线程中join()的使用方法

本篇内容主要讲解“Python多线程以及多线程中join()的使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python多线程以及多线程中join()的使用方法”吧!Python多线程与
2023-06-20

解决Go语言Websocket应用程序中的线程阻塞问题

解决Go语言Websocket应用程序中的线程阻塞问题在开发Web应用程序时,使用Websocket是一种非常常见和流行的方式。它可以建立持久的连接,并在服务器和客户端之间实时通信。然而,有时候我们可能会遇到线程阻塞的问题,这会导致应用程序
解决Go语言Websocket应用程序中的线程阻塞问题
2023-12-14

深入浅析python中的多进程、多线程、协程

进程与线程的历史我们都知道计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心,它承担计算机的所有任务。 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。 程序是运行在系统上的具有某种功能的软件,比
2022-06-04

浅析android中的线程封装

简单写一下android 对线程 的c++封装~~~其实API已经写得很清楚了~~ 封装 的文件 :/frameworks/base/include/utils/threads.h 这里不讨论具体实现,具体实现是和系统 相关联的~~首先An
2022-06-06

Java多线程之多种锁和阻塞队列的示例分析

这篇文章给大家分享的是有关Java多线程之多种锁和阻塞队列的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、悲观锁和乐观锁1.1. 乐观锁顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以
2023-06-15

python 简单搭建阻塞式单进程,多进程,多线程服务的实例

我们可以通过这样子的方式去理解apache的工作原理 1 单进程TCP服务(堵塞式) 这是最原始的服务,也就是说只能处理个客户端的连接,等当前客户端关闭后,才能处理下个客户端,是属于阻塞式等待from socket import * ser
2022-06-04

Python多线程与同步机制浅析

线程(Thread)是操作系统能够进行运算调度的最小单位;线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源
2022-12-22

深入浅析Node中的进程和线程

线程和进程是计算机操作系统的基础概念,在程序员中属于高频词汇,那如何理解呢?Node.js 中的进程和线程又是怎样的呢?下面本篇文章就来带大家深入了解一下Node中的进程和线程。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
2023-05-14

如何在Java项目中实现多线程的阻塞与唤醒

如何在Java项目中实现多线程的阻塞与唤醒?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java线程的阻塞及唤醒 1. sleep() 方法: sleep(…毫
2023-05-31

深入浅析Java中线程的优先级

本篇文章为大家展示了深入浅析Java中线程的优先级,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java 线程优先级详解及实例操作系统基本采用时分的调度运行线程,操作系统会分出一个个时间片,线程会被
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录