多线程
多线程 vs 多进程
-
程序:一堆代码以文本形式存入一个文档
-
进程: 程序运行的一个状态
- 包含地址空间,内存,数据栈等
- 每个进程由自己完全独立的运行环境,多进程共享数据是一个问题
-
线程
- 一个进程的独立运行片段,一个进程可以由多个线程
- 轻量化的进程
- 一个进程的多个现成间共享数据和上下文运行环境
- 共享互斥问题
-
全局解释器锁(GIL)
-
python代码由虚拟机进行控制
-
在主循环中只能由一个控制线程在执行
-
python包
- thread : 有问题,不好用py3改成了_thread
- threading : 通行的包
- 案例01:
-顺序执行 耗时比较长 - 案例02:
-使用多线程,耗时变短。使用_thread - 案例03:
-多线程, 传参数
-
threading的使用
- 直接利用threading.Thread生成thread实例
- t = threading.thread(target=xxx,arg=(xxx,))
- t.start():启动多线程
- t.join(): 等待多线程支线完成
- 案例04
- 案例05 放入join 和04 做比较
- 05中全部结束时间就成了垫底
- 守护线程 -damon
- 如果在程序中将子线程设置成守护线程,则子线程会在主线结束时自动退出
- 一般认为,守护线程不重要或者不能离开主线
- 守护线程案例是否有效果与环境相关
- 案例06:非守护线程
- 案例07:守护线程
线程主要属性 :
- threading.currentThread:返回当前线程变量 - threading.enumerate:返回一个包含正在运行的线程的list,正在运行的线程指的是线程启动后,结束前的状态 - threading.activeCount: 返回正在运行的线程数量,效果跟 len(threading.enumerate)相同 - thr.setName: 给线程设置名字 - thr.getName: 得到线程的名字 - 线程属性案例08:
- 直接利用threading.Thread生成thread实例
-
直接继承来自thread.Thread
- 直接继承Thread
- 重写run函数
- 类实例可以直接运行
- 案例09
- 案例10, 工业风案例
- loop = [4,2]
class ThreadFunc:
def __init__(self, name):
self.name = name
def loop(self, nloop, nsec):
'''
:param nloop: loop函数的名称
:param nsec: 系统休眠时间
:return:
'''
print('Start loop ', nloop, 'at ', ctime())
sleep(nsec)
print('Done loop ', nloop, ' at ', ctime())
def main():
print("Starting at: ", ctime())
# ThreadFunc("loop").loop 跟一下两个式子相等:
# t = ThreadFunc("loop")
# t.loop
# 以下t1 和 t2的定义方式相等
t = ThreadFunc("loop")
t1 = threading.Thread( target = t.loop, args=("LOOP1", 4))
# 下面这种写法更西方人,工业化一点
t2 = threading.Thread( target = ThreadFunc('loop').loop, args=("LOOP2", 2))
# 常见错误写法
#t1 = threading.Thread(target=ThreadFunc('loop').loop(100,4))
#t2 = threading.Thread(target=ThreadFunc('loop').loop(100,2))
t1.start()
t2.start()
t1.join( )
t2.join()
print("ALL done at: ", ctime())
if name == ‘main’:
main()