一、多线程概述
1.进程与线程
进程:启动一个qq应用
线程:qq应用里的一些很多操作
2.进程组成
内存:每个进程的内存是相互独立的
文件/网络句柄:它们是所有的进程所共有的,例如打开同一个文件,去抢同一个网络的端口这样的操作是被允许的
3.多线程
4.Threading模块
1)模块
2)常用方法:
3)基本用法
4)基本概念
全局解释器锁(GIL):在CPython中,无论CPU有多少核,同时只能执行一个线程,这是由于GIL的存在导致的。可以把GIL看做是执行任务的“通行证”,并且在一个Python进程中,GIL只有一个。
守护进程:其作用就是在主进程想要退出进程的时候,不需要等待自己运行结束,直接退出就行了。
t1.setDaemon(Ture)
死锁:在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
5.多线程基础
import time
import os
import threading
# def doing(something):
# time.sleep(2)
# print('正在做>>>', something)
# start_time = time.time()
# doing('在上课')
# doing('在加班')
# end_time = time.time()
# print('总共耗时>>>', end_time-start_time)
# os.getpid() # 获取pid
# ------------------------------------------------------
# 需求:减少执行时间
# 方案:
# io密集型的场景
# ------------------------------------------------------
# def doing(something):
# print('正在做>>>', something)
# time.sleep(2)
# start_time = time.time()
# 创建线程
"""
target 你这个线程是做什么---需要执行的函数名
args 一般是一个元组 是你 target 函数x需要传递的实参
直接启动线程:主线程(main)不等待子线程(t1,t2)运行完就结束了
# 需求:主线程退出前,子线程都需要做完事情!
"""
# t1 = threading.Thread(target=doing, args=('我在上课!', ))
# t2 = threading.Thread(target=doing, args=('我在上班!', ))
#
# # 2- 启动线程
# t1.start() # 异步非阻塞
# t2.start()
#
# # 3- 阻塞主线程继续执行
# t1.join() # 同步阻塞
# t2.join()
#
# end_time = time.time()
# print('总共耗时>>>', end_time-start_time)
# ------------------------------------------------------
# 需求:减少执行时间
# 方案:
# 计算io密集型的场景
"""
GIL:CPython,同一时刻,只有一个线程在运行,cpu在不同线程之间来回切换
"""
# ------------------------------------------------------
# def doing():