多线程
在介绍Python中的线程之前,先明确一个问题,Python中的多线程是假的多线程!
因为全局解释器锁(GIL)
为什么要GIL
为了线程间数据的一致性和状态同步的完整性
GIL的影响
只有一个线程在运行,无法使用多核。
在多线程环境中,Python虚拟机按照以下方式执行。
1.设置GIL。
2.切换到一个线程去执行。
3.运行。
4.把线程设置为睡眠状态。
5.解锁GIL。
6.再次重复以上步骤。
# 使用线程
from threading import Thread
def loop():
while True:
print("开饭了?")
if __name__ == '__main__':
for i in range(3):
t = Thread(target=loop)
t.start()
while True:
pass
# 而如果我们变成进程呢?cpu --100%
from multiprocessing import Process
def loop():
while True:
print("开饭了?")
if __name__ == '__main__':
for i in range(3):
t = Process(target=loop)
t.start()
while True:
pass
cpu密集型(计算密集型)、I/O密集型
计算密集型任务由于主要消耗CPU资源,代码运行效率至关重要,C语言编写
IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成,99%的时间花费在IO上,脚本语言是首选,C语言最差。
创建多线程
普通的线程,主线程结束时,子线程还会运行
def run():
time.sleep(2)
print('当前线程的名字是',threading.current_thread().name)
time.sleep(2)
if __name__ == '__main__':
start_time = time.time()
print('这是主线程',threading.current_thread().name)
thread_list = []
for i in range(5):
t = threading.Thread(target=run)
thread_list.append(t)
for t in thread_list:
t.start()
print('主线程结束',threading.current_thread().name)
print('一共用时:', time.time() - start_time)
设置守护线程
当主线程结束时,子线程也会结束
import threading
import time
def run():
time.sleep(2)
print('当前线程的名字是',threading.current_thread().name)
time.sleep(2)
if __name__ == '__main__':
start_time = time.time()
print('这是主线程',threading.current_thread().name)
thread_list = []
for i in range(5):
t = threading.Thread(target=run)
thread_list.append(t)
for t in thread_list:
t.setDaemon(True)
t.start()
print