验证GIL的存在
GIL的存在使得同一个进程下的多个线程无法同时执行
from threading import Thread
money = 100
def task():
global money
money -= 1
t_list = []
for i in range(100):
t = Thread(target=task)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print(money) # 0
ps:加入t_list列表添加线程对象,是为了保证所有的线程执行完了之后,才执行查看最后的money
验证GIL的特点
GIL不会影响程序层面的数据,也不会保证它的修改是安全的,要想保证自己程序的数据安全,得自己加锁
from threading import Thread
import time
money = 100
def task():
global money
tmp = money
time.sleep(0.1)
money = tmp - 1
t_list = []
for i in range(100):
t = Thread(target=task)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print(money) # 99
from threading import Thread,Lock
import time
money = 100
mutex = Lock()
def task():
mutex.acquire()
global money
tmp = money
time.sleep(0.1)
money = tmp - 1
mutex.release()
t_list = []
for i in range(100):
t = Thread(target=task)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print(money) # 0
验证python多线程是否有用
python的多线程确实无法使用多核优势 但是在IO密集型的任务下是有用的
验证python多线程是否有用,需要分两种情况:第一种:是单个cpu还是多个CPU;第二种:是IO密集型(代码有IO操作),计算密集型(代码没有IO操作);根据这两种情况,可得出以下结论
1.单个CPU
1.1 IO密集型:多线程有优势
多进程:申请额外的空间,消耗更多的资源
多线程:消耗资源相对较少,可以通过多道技术,提升CPU的效率
1.2 计算密集型:多线程有优势
多进程:申请额外的空间,消耗更多的资源(总耗时+申请空间+拷贝代码+切换)
多线程:消耗资源相对较少,通过多道技术(总耗时+切换)
2.多个CPU
2.1 IO密集型:多线程有优势
多进程:总耗时(单个进程耗时+IO操作+申请空间+拷贝代码)
多线程:总耗时(单个进程的耗时+IO)
2.2 计算密集型:多进程有优势
多进程:总耗时(单个进程耗时+IO操作+申请空间+拷贝代码)
多线程:总耗时(多个进程的综合)
验证:在多个CPU且IO密集型的情况
在多核CPU且IO密集型的情况下,多线程有优势
多进程:
from multiprocessing import Process
import time
def work():
time.sleep(2) # 模拟纯IO操作
if __name__ == '__main__':
start_time = time.time()
p_list = []
for i in range(100):
p = Process(target=work)
p.<