python多任务编程_python线程的多任务编程

多任务

多任务介绍

对于人来说,一边听歌,一边跳舞就是多任务。

对于电脑,简单的说,同一时间执行多个程序处理数据叫做多任务

多任务理解

单核CPU

9e2ae74f1a352a4303aa86f7e7e3be2f.png

单核cpu在处理多任务的时候是根据时间片轮转的方式进行的,比如执行QQ1us,然后切换微信执行1us,最后是执行钉钉1us,如此循环。因为cpu的切换速度过快,导致我们认为三个软件是同时执行的

多核cpu

d3ad2ef5ae0d3b33361bb4fec82b6051.png

并发:当cpu不能同时执行当前所有任务时,就会循环执行,是假的多任务

并行:当cpu可以同时执行当前所有任务时,是真的多任务

多任务的实现方式

实现多任务有三种方式:

线程

进程

协程

线程

线程介绍

线程是指在一个单独进程中,对于CPU和内存而言的多个工作单位,所有线程在进程中的资源都是共享的,包括全局数据、执行代码等。

线程的使用

先介绍三个方法

setDaemon(True): 主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.

join(): 主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行

enumerate(): 查看线程数量

使用

代码示例import threading

import datetime

def A():

print('函数A')

print(datetime.datetime.now())

def B():

print('函数B')

print(datetime.datetime.now())

if __name__ == '__main__':

# 指定线程到A()和B()函数里执行

t1 = threading.Thread(target=A)

t2 = threading.Thread(target=B)

# 执行线程

t1.start()

t2.start()

print('--end--')

从输出结果可以知道,两个线程是在同一时间一起执行的。不过因为抢占式的特点,最后一条语句print('--end--')有时会在子线程的前面执行。

join()方法的使用

如果我们想让print('--end--')在最后执行,可以用到join()方法,当子线程结束后,主线程才会结束。

join方法的使用,代码示例

import threading

import datetime

def A():

print('函数A')

print(datetime.datetime.now())

def B():

print('函数B')

print(datetime.datetime.now())

if __name__ == '__main__':

# 指定线程到A()和B()函数里执行

t1 = threading.Thread(target=A)

t2 = threading.Thread(target=B)

# 执行线程

t1.start()

t2.start()

t1.join()

t2.join()

print('--end--')

setDaemon()方法的使用

如果不想让主线程等待子线程完成后才结束,可以使用setDaemon

代码示例import threading

import time

def A():

for i in range(3):

print("A")

time.sleep(1)

if __name__ == '__main__':

t1 = threading.Thread(target=A)

t1.setDaemon(True) # 要放在线程开始之前

t1.start()

enumerate()的使用,查看线程数量

代码示例import threading

import datetime

def A():

print('函数A')

print(datetime.datetime.now())

def B():

print('函数B')

print(datetime.datetime.now())

if __name__ == '__main__':

# 创建两个主线程,指定线程到A()和B()函数里执行

t1 = threading.Thread(target=A)

t2 = threading.Thread(target=B)

# 执行线程

t1.start()

t2.start()

print(threading.enumerate())

print('--end--')

子线程的创建与执行

当我们调用start()方法时,子线程才会被创建,并且执行

继承Thread类创建线程

我们可以通过修改Thread类的run()方法里的代码,来完成重写run()方法

代码示例import threading

class T(threading.Thread):

def run(self):

self.a()

def a(self):

for i in range(3):

print('a')

if __name__ == '__main__':

t1 = T()

t1.start() # 当调用start()方法时,会主动调用run()方法

当我们调用start()方法时,会主动调用run()方法

多线程共享全局变量

代码示例import threading

def a():

global num

num += 1

print(f'a:{num}')

def b():

print(f'b:{num}')

if __name__ == '__main__':

num = 10

print(num)

t1 = threading.Thread(target=a)

t2 = threading.Thread(target=b)

t1.start()

t2.start()

print(num)

线程的传参

当用线程去函数里执行代码时,我们可以看到函数后边是没有括号()的,所以涉及到传参的时候我们该怎么解决这个问题?

解决方法

我们可以使用args参数进行传参,参数为元组

当我们想要传入字典时,可以使用kwargs进行传入

代码示例import threading

def a(x):

print(x)

def b(**kwargs):

print(kwargs)

if __name__ == '__main__':

num = 1

# 使用args参数进行传参

t1 = threading.Thread(target=a, args=(num,))

# 使用kwargs参数进行传入字典

t2 = threading.Thread(target=b, kwargs={"A": 1})

t1.start()

t2.start()

线程的资源抢占

代码示例import threading

def a(x):

global num

for i in range(x):

num += 1

print(f'a: {num}')

def b(x):

global num

for i in range(x):

num += 1

print(f'b: {num}')

if __name__ == '__main__':

num = 100

t1 = threading.Thread(target=a, args=(1000000, ))

t2 = threading.Thread(target=b, args=(1000000, ))

t1.start()

t2.start()

print(num)

运行结果

382b3d51cd3ac994fe51a14123e64e89.png

正常的结果应该是2000100,但是因为资源抢占导致数据不正确,使用锁就可以避免这个问题,下篇博客我会细讲怎么解决这个问题。

最后,有喜欢博主写的内容的伙伴可以点赞收藏加关注哦!

本文地址:https://blog.csdn.net/weixin_44604586/article/details/107091271

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

列举python的5个数据类型_python公开课|新公布的5个python核心数据类型,这些细节你难道还不不知道吗...

【摘要】在这个科学技术高速发展的时代,越来越多的人都开始选择学习编程软件,那么首先被大家选择的编程软件就是python,也用在各行各业之中,并被大家所熟知,所以也有越来越多的python学习者关注python就业方向问题&…

selenium3 + python - page_source页面源码

前言: 有时候通过元素的属性的查找页面上的某个元素,可能不太好找,这时候可以从源码中爬出想要的信息。selenium的page_source方法可以获取到页面源码。 本次以博客园为例,先爬取页面源码,通过re正则表达式爬取出url&a…

简单分析Guava中RateLimiter中的令牌桶算法的实现

为什么80%的码农都做不了架构师?>>> 令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目&am…

gcc oracle mysql_Linux下C语言访问Oracle数据库Demo

前提条件1. Linux环境已经存在,安装好了Oracle本demo 运行环境本地环境 RedHat LINUX AS 4 ,ORACLE 10G本地数据库sid orcl,ip:127.0.0.1,用户名:kingbi,密码:kingbi,表dsd_test. 显示表dsd_test 的所有记录.步骤:(1) 创建表 …

炼数成金数据分析课程---16、机器学习中的分类算法(交叉内容,后面要重点看)...

炼数成金数据分析课程---16、机器学习中的分类算法(交叉内容,后面要重点看) 一、总结 一句话总结: 大纲实例快速学习法 主要讲解常用分类算法(如Knn、决策树、贝叶斯分类器等)的原理及python代码实现 1、什么是分类? 分…

NFS配置详解

1、NFS服务介绍1.1 什么是NFS?NFS是Network File System的缩写。中文意思是网络文件系统。它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或者目录。NFS客户端(一般为应用服务器,例如web&…

idea用法

更新gradle的依赖后,刷新项目引入jar包的方法: view--Tool Buttons 在右侧 Gradle 点刷新 转载于:https://www.cnblogs.com/z360519549/p/10994897.html

linux备份mysql需要暂停服务吗_【MySQL运维】线上MySQL数据库停服迁移流程

一、数据备份与恢复阶段,选在凌晨1点进行操作,暂停服务进行备份(允许停服2个小时)1、首先停止Nginx服务,并且修改数据库用户密码,防止还有新的连接进来2、杀掉某个用户所有进程for i in mysql -udba -pPASSWORD -ssse "show …

免费下载!5本阿里技术好书,带你看更大的世界

共享、开源是互联网技术发展的重要精神。在过去,25000多万名阿里工程师,撰写了一系列精品技术丛书,从算法、研发到职业人生随笔,应有尽有。目前该系列丛书已全部开放下载,供技术人免费阅读。 今天小编整理了其中的五本…

python3安装mysqlclient_Python3 安装mysqlclient错误处理(MAC版)

在使用django的时候需要安装mysqlclient库,很多时候会出现以下报错:running installrunning bdist_eggrunning egg_infowriting mysqlclient.egg-info/PKG-INFOwriting dependency_links to mysqlclient.egg-info/dependency_links.txtwriting top-level names to mysqlclient.…

React绑定事件处理函数this的几种方法

在以类继承的方式定义的组件中,为了能方便地调用当前组件的其他成员方法或属性(如:this.state),通常需要将事件处理函数运行时的 this 指向当前组件实例。 绑定事件处理函数this的几种方法: 第一种方法&…

乌班图系统16.04安装

本例jiyu基于Ubuntu16.04 64位版本为例进行安装,安装的方式有多种,本文使用光盘进行安装安装前应准备好,将Ubuntu的镜像文件刻成光盘,然后将光盘放入光驱,并设置服务器从光盘启动,开机到如下界面:按Enter键到下一步,如…

python做游戏用什么软件_用Python自制谷歌小游戏

谷歌流量器中有个很有名的彩蛋:当你网络出现问题时,就会出现一个“小恐龙游戏”。(如果想要直接进行游戏,可以在地址栏输入:chrome://dino)今天我们就来给大家演示下,用Python来自己做一个仿制的“小恐龙游戏”&#x…

使用maven构建项目候,jar包错误的解决办法

1、删除架包,重新下载,右键项目点击"run as"中的“maven clean”,然后再maven中找到Update Project 2、可以在代码中,把鼠标放到报错的架包上 点击划红线部分,进行安装 转载于:https://www.cnblogs.com/qingqian/p/1099…

MySQL——通过EXPLAIN分析SQL的执行计划

在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。下面分别对EXPLAIN命令结果的每一列进行说明:select_type:表示SELECT的类型,常见的取值有:…

python将argv作为参数_在jupyter / ipython notebook中将命令行参数传递给argv

经过大量的环顾后,我发现了非常繁琐的自定义库,但是用几行代码解决了它,我认为这些代码很漂亮.我使用nbconvert最终得到一个html报告作为输出,包含笔记本中的所有图形和降价,但是通过最小的python包装器接受命令行参数:python文件test_args.py(正常执行命令行参数)&…

模拟输入(ADC-A0)

ESP8266具有内置的10位ADC,只有一个ADC通道(A0引脚),即只有一个ADC输入引脚可读取来自外部器件的模拟电压 ESP8266上的ADC通道和芯片供电电压复用,也就是说我们可以将其设置为测量系统电压或者外部电压 测量外部电压: analogRead(…

SQL Server 连接超时案例一则

原文:SQL Server 连接超时案例一则上周六,一工厂系统管理员反馈一数据库连接不上,SSMS连接数据库报“连接超时时间已到。在尝试使用预登录握手确认时超过了此超时时间.......”, 如下截图所示: 另外远程连接也连接不上,系统管理员…

mysql 删除5天前 备份_mysql自动备份删除5天前的备份

1、查看磁盘空间情况:df -h2、创建备份目录:上面我们使用命令看出/home下空间比较充足,所以可以考虑在/home保存备份文件;cd /homemkdir backupcd backup3、创建备份Shell脚本:注意把以下命令中的DatabaseName换为实际的数据库名称…

个人作业-Alpha项目测试

这个作业属于哪个课程https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2作业地址https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3340团队名称脑阔疼https://www.cnblogs.com/chaserFF/p/10994338.html这个作业的目标完成班级项目互评…