Python多线程学习

Python多线程学习

在使用tkinter过程中,调用一个函数发现主界面长时间未响应,原因是这个函数占用太长时间.界面卡死,这里应该要用多线程解决

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  • 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
  • 程序的运行速度可能加快。
  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

image-20210730190703000

这里使用threading模块解决

image-20210730191254448

创建子线程,需要两个要素

1.线程对象:线程对象是threading模块的线程类Thread或子类

2.线程体:线程体是子线程要执行的代码,这些代码会被封装到一个函数.子线程在启动后会执行线程体.实现线程体主要有:

  1. 自定义函数实现线程体
  2. 自定义线程类实现线程体

自定义函数实现线程体

创建线程对象的构造方法

Thread(target=None,name=None,args=())

image-20210730193033951

注意 Thread还有daemon属性,守护进程,默认为False

即主线程若运行完后子线程还未运行完,则子线程将继续运行

设置为True后主线程运行完,子线程也将被kill

1
thread = threading.Thread(target=test,name='TestThread',daemon=True)

自定义线程类实现线程体

继承threading.Thread,实现run方法

image-20210730194648097

线程管理

1.等待线程结束

join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生

有时一个线程需要等待另外一个线程执行结束才能继续执行

join()

image-20210730195311797

线程间还有通信

线程可以利用全局变量,因此容易造成混乱

互斥锁

threading模块有Lock类可以方便处理锁定

Lock类有acquire()锁定和release()释放锁

同时还有Queue队列

这里就不细说了

相关资料:Python3 多线程

python tkinter界面卡死的解决办法

-------------本文结束感谢您的阅读-------------
感谢阅读.

欢迎关注我的其它发布渠道