进程与线程
进程:操作系统中一个任务就是一个进程(如qq,微信,windows的任务管理器里的任务)
线程:一个进程有很多线程,每个线程做一件事(qq既可以聊天也可以视频)
一个进程中至少有一个线程,如果有多个线程,就是我们俗称的多线程
单核cpu计算机也可以实现多进程和多线程,他只是在不断的切换线程(cpu的执行速度很快,所以切换的速度非常快)
线程和进程切换由操作系统来决定
多线程的问题:
线程不安全:多线程中,变量是共享的,多个线程同时操作一个变量会引发变量的数据异常
GIL全局解释锁:每个进程一把锁,启动线程先加锁,结束线程释放锁,虽然解决了变量的问题,但对性能有影响,但也不是对所有的性能都有影响
复杂程序的分类:
cpu密集型
io密集型(大量的文件读写)
io耗时越长,多线程效率越高(即io密集型任务下,gil全局解释锁效率还是很高的)
单线程与多线程的效率对比:
import threading
import time
#假设这是网络程序,请求数据
def request_data():
time.sleep(0.02)#模拟网络操作
def main_single_thread():
for i in range(100):
request_data()
def main_multi_threads():
thread_list = []
for i in range(100):
t = threading.Thread(target=request_data)
t.start()
thread_list.append(t)
#如果前面代码没有完成,他就一直阻塞在这
#这样就能求出一百个线程中最慢的那个时间
for i in thread_list:
i.join()
if __name__ == '__main__':
#单线程时间计算
start_time = time.time()
main_single_thread()
end_time = time.time()
print('单线程耗时:{:.4f}s'.format(end_time - start_time))
#多线程时间计算
start_time = time.time()
main_multi_threads()
end_time = time.time()
print("多线程耗时:{:.4f}s".format(end_time-start_time))