python3 线程、进程

线程、进程

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

 

原文地址:https://www.cnblogs.com/jay-col/p/11008836.html