标签:__name__ star class 全局 process range tar span book
python由于有全局解释锁(GIL)的原因,Python 的线程被限制到同一时刻只允许一个线程执行这样一个执行,所以妨碍了其真正的使用功效,但是对于IO型程序并没有多少影响,后续说解决办法
线程(对于IO密集型程序可以大幅提高程序运行速度,减少执行时间)
python3 目前推荐使用threading
import time start = time.time() def look_thread(name): for i in range(5): time.sleep(0.5) print(‘主程序{}运行‘.format(name)) look_thread(‘1‘) look_thread(‘2‘) end = time.time() print(end-start)
这个是无线程运行后输出的结果以及所花费的时间
主程序1运行
主程序1运行
主程序1运行
主程序1运行
主程序1运行
主程序2运行
主程序2运行
主程序2运行
主程序2运行
主程序2运行
5.005494832992554
接下来看看使用线程后的程序
import threading import time from threading import Thread start = time.time() def look_thread(name): for i in range(5): time.sleep(0.5) # print(‘主程序{}运行‘.format(name)) print("线程{}正在运行".format(name)) t1 = Thread(target=look_thread,args=(‘1‘,)) #创建线程1 t2 = Thread(target=look_thread,args=(‘2‘,)) #创建线程2 #t1 = Thread(target=look_thread,args=(‘1‘,),daemon=True) #如果不喜欢使用join可以使用保护线程 #t2 = Thread(target=look_thread,args=(‘2‘,),daemon=True) #创建线程2 t1.start() #启动线程1 t2.start() #启动线程2 print(threading.active_count()) #现存线程数 t1.join() #将线程1加入到当前线程 t2.join() #将线程2加入到当前线程 print(threading.active_count()) #现存线程数 end = time.time() print(end-start) #运行时间
结果如下
3
线程1正在运行
线程2正在运行
线程1正在运行
线程2正在运行
线程1正在运行
线程2正在运行
线程1正在运行
线程2正在运行
线程1正在运行
线程2正在运行
1
2.504371404647827
2个对比可以看出,明显不是按照持续执行,且线程数的变化和运行时间的减半
进程(建议在cpu密集型程序使用)
python3 使用multiprocessing,使用方法同threading
import time from multiprocessing import Process start = time.time() def look_thread(name): for i in range(5): time.sleep(0.5) # print(‘主程序{}运行‘.format(name)) print("进程{}正在运行".format(name)) if __name__ == "__main__": t1 = Process(target=look_thread,args=(‘1‘,)) t2 = Process(target=look_thread,args=(‘2‘,)) t1.start() t2.start() t1.join() t2.join() end = time.time() print(end-start)
结果如下
进程1正在运行
进程2正在运行
进程2正在运行进程1正在运行
进程1正在运行
进程2正在运行
进程1正在运行进程2正在运行
进程2正在运行
进程1正在运行
2.7984180450439453
参考书籍:python3-cookbook
标签:__name__ star class 全局 process range tar span book
原文地址:https://www.cnblogs.com/jay-col/p/11008836.html