之前我们做的自动化工具,每当开始处理数据,GUI(图形界面)就会变成无响应了,用户体验很不好。

这次,我们来给工具加上多线程,让它在处理数据的同时,GUI也能进行交互。


首先,带大家简单了解下,什么是线程、进程和协程。大家看看下面代码的执行逻辑:

import time
​
count = 0 # 执行任务次数为0
​
def down_file():# 定义一个下载文件的函数time.sleep(10) # 等待10秒count += 1 #执行任务次数加1print("finish!") # 下载完成def wait_a_minute(): # 定义一个会等待数秒的函数time.sleep(5) # 等待5秒count += 1 #执行任务次数加1print("ok!")down_file()
wait_a_minute()
print(count) # 打印执行任务次数

一般来说,程序有一个进程,进程里有一个线程。由于我们只有一个线程,没办法同时执行两段代码,所以只能一个一个执行函数。按顺序执行完程序,用时15秒。

有没有什么办法能提高效率呢?

有,我们可以用多线程。给程序再加一个线程,主线程执行上面的函数,子线程执行下面的函数,用时10秒,执行完后打印count,值为2。(注意:如果两个线程同时对count进行运算,结果会出错。有需要时可以给count(临界资源)家一个锁,得到钥匙的线程才能执行,执行完后释放钥匙,让下一个线程获得钥匙。)

我们还可以用多进程。主进程执行上面的函数,子进程执行下面的函数,用时10秒。执行完后打印count,你可能认为值为2,但值却是1。count明明加了两次,可是为什么值却是1呢?所有线程共享一块内存空间,可以共享所有变量,但所有进程都有各自的内存空间,两个进程都有各自的count变量,所以需要在进程间建立通信。

我们还可以用协程。协程只有一个进程,一个线程,它只能同时执行一段代码,但是,它在执行到下载任务时,会让系统继续下载,自己却跑到其他代码上继续执行。等下载完成,它才回到之前的地方往下执行。

好了,以上是对线程、进程、协程的粗浅介绍。我是以使用为导向的,很多用法都没讲,推荐大家看一下廖雪峰的教程的相关章节。


我们思考一下,为什么我们之前写的带GUI的应用,在处理数据时会无响应呢?

对了,因为只有一个线程,无法同时执行GUI的代码和数据处理的代码。

以下是改造成多线程前的代码:

class demo():def __init__(self):# 省略一万行self.bo_deal = tk.Button(window, text='处理文件', command=self.deal_files)# 省略一万行
​def deal_files(self):print("正在处理数据")print("数据处理完成")

改造一下代码:

from threading import Thread #引入库
​
class demo():def __init__(self):# 省略一万行self.bo_deal = tk.Button(window, text='处理文件', command=self.deal_files)# 省略一万行def deal_files(self):def run():print("正在处理数据")print("数据处理完成")t = Thread(target=run) # 创建线程。如需传入参数,可用args参数,例args=(1,2,3)t.start() # 启动线程t.join() # 等线程执行完毕后,才往下执行

好了,你已经知道如何做了,那就马上打开电脑,改造你的程序吧!

程序定制可私信。逃离重复性工作,留出时间提升自己!

让线程等待10秒_把python程序变成多线程相关推荐

  1. pythontk多线程_把python程序变成多线程

    之前我们做的自动化工具,每当开始处理数据,GUI(图形界面)就会变成无响应了,用户体验很不好. 这次,我们来给工具加上多线程,让它在处理数据的同时,GUI也能进行交互. 首先,带大家简单了解下,什么是 ...

  2. 如果添加1条数据会等待10秒,你愿意等吗

    首先说明,这个问题出于自己写的一个小demo,很简单的数据添加操作,起初就是添加一条数据,成功之后刷新页面.后面觉得,刷新页面体验不好,就改成成功之后异步加载数据了,界面体验好了一些. 但是突然的就在 ...

  3. python 时间-秒_Python-代码等待10秒不直观,教你用进度条显示时间进度

    1.前言 你有没有试过代码里等待几秒再继续做下一件事,但是控制台日志啥都没打,一直傻傻的等? 今天教大家显示实时打印等了多少秒的进度条,希望大家喜欢. 2.工具登场 今天跟大家分享的Python库就是 ...

  4. java 等待几秒_问懵逼:请站在 JVM 角度谈谈 Java 的锁?

    存在的问题 自旋锁 自适应自旋 Java 对象的内存布局(重要) synchronized 锁升级流程 偏向锁 轻量级锁 重量级锁 可重入 悲观锁(互斥锁.排他锁) <Java 2019 超神之 ...

  5. python时间函数纳秒_在Python中以秒和纳秒获取POSIX / Unix时间?

    我一直在努力找到一种方法来获取自1970-01-01 00:00:00 UTC以来的时间,以秒为单位,在python中以纳秒为单位,我找不到能给我正确精度的任何东西. 我尝试过使用时间模块,但是精度只 ...

  6. python程序员面试题精选100题_在Python程序员面试中被问的最多的10道题

    我们在为大家整Python程序员面试试题中,发现了一些被面试官问到的最多的一些问题,以下就是本篇内容: Python是个非常受欢迎的编程语言,随着近些年机器学习.云计算等技术的发展,Python的职位 ...

  7. python程序运行原理_谈谈 Python 程序的运行原理

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...

  8. python 重启程序_重新启动Python程序

    我会绕过所有的焦虑,你可能会从试图重新运行自己,把它交给环境. 我的意思是:当程序以特定的"重新启动"代码退出时,有一个控制程序只在循环中运行程序(使用与给定参数相同的参数).这可 ...

  9. python打折简单程序每满_丰满Python程序设计基础【实境编程】_高校邦_答案

    丰满Python程序设计基础[实境编程]_高校邦_答案h779 丰满Python程序设计基础[实境编程]_高校邦_答案 关注公众号{帅搜}即可查询答案 支持:大学网课,智慧树,知到,超星,尔雅,学习通 ...

最新文章

  1. spring集成Apache的ActiveMQ
  2. matlab ac电源,MATLAB对AC/DC/AC电源的死区效应谐波仿真
  3. 斥资2亿加码新消费,“瓜子之王”洽洽要圆“坚果梦”?
  4. linux调用一个函数失败 打印错误,linux系统调用出错时的处理函数
  5. Java初学者推荐的几本书
  6. oracle数据库计数器,DM 达梦数据库 表的 行计数器(COUNTER)属性
  7. 华为云welink考试试题_华为内部开启WeLink项目,华为云是这样考虑的-通信/网络-与非网...
  8. CF1166E The LCMs Must be Large
  9. 【OpenCV学习】基于轮廓寻找的视频流运动检测
  10. linux下载python的地址_Linux下Python获取IP地址的代码
  11. 1流式细胞术荧光比值计算_浅谈流式细胞仪的工作原理和应用
  12. 多线程编程(1) - 认识等待函数 WaitForSingleObject
  13. Python代码自动转成C++代码
  14. PHP货币转中文大写函数
  15. 2265. 统计值等于子树平均值的节点数
  16. D - Daydreaming Stockbroker Gym - 101550D
  17. sentinel.conf样例
  18. 2021年度训练联盟热身训练赛第三场——C,G,I
  19. mysql的char在java中表示为_Java学习篇之-Mysql中varchar门类总结_mysql
  20. 社交网站需要多大的服务器空间,社交app选多大云服务器

热门文章

  1. linux mysql 最小安装,Linux最小化安装之安装mysql
  2. linux oracle脚本编写,Linux 脚本编写基础(一)--语法
  3. php 路径 函数不存在,php目录不存在是怎么判断的
  4. 立体栅格地图_更新丨智图栅格数据—彩色版地图,智臻智美,带来更好的业务体验...
  5. html检查链接正确代码,Groovy脚本检查html坏链接
  6. tps协议和onvif协议_做监控的你,应该了解的ONVIF协议!
  7. iris数据_Kaggle 数据可视化课程5
  8. 性能测试报告模板_性能测试规范之测试报告
  9. c语言中return的作用_C语言入门基础整理
  10. 64位内核开发第二讲.内核编程注意事项,以及UNICODE_STRING