Python多线程学习
在使用tkinter过程中,调用一个函数发现主界面长时间未响应,原因是这个函数占用太长时间.界面卡死,这里应该要用多线程解决
- 使用线程可以把占据长时间的程序中的任务放到后台去处理。
- 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
- 程序的运行速度可能加快。
- 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
这里使用threading模块解决
创建子线程,需要两个要素
1.线程对象:线程对象是threading模块的线程类Thread或子类
2.线程体:线程体是子线程要执行的代码,这些代码会被封装到一个函数.子线程在启动后会执行线程体.实现线程体主要有:
- 自定义函数实现线程体
- 自定义线程类实现线程体
自定义函数实现线程体
创建线程对象的构造方法
Thread(target=None,name=None,args=())
注意 Thread还有daemon属性,守护进程,默认为False
即主线程若运行完后子线程还未运行完,则子线程将继续运行
设置为True后主线程运行完,子线程也将被kill1
thread = threading.Thread(target=test,name='TestThread',daemon=True)
自定义线程类实现线程体
继承threading.Thread,实现run方法
线程管理
1.等待线程结束
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生
有时一个线程需要等待另外一个线程执行结束才能继续执行
join()
线程间还有通信
线程可以利用全局变量,因此容易造成混乱
互斥锁
threading模块有Lock类可以方便处理锁定
Lock类有acquire()锁定和release()释放锁
同时还有Queue队列
这里就不细说了
相关资料:Python3 多线程