一、并发和并行
多任务的概念:
1.简单地说,就是操作系统可以同时运行多个任务。
并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现多个任务
"一起"执行(实际上总有一个任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)
例子: 就相当于好几个同学,同时提问一个老师,老师只能一个个回答。
并行:指的是任务数小于等于cpu核数,即任务真的一起执行的
例子: 就相当于好几个同学,同时提问。多个老师同时给每个同学解答
总结:真正的并行执行多任务只能在多核cpu上实现,但是由于任务数量远远多于cpu的核心
数量,所以操作系统也会自动把很多任务轮流调度到每个核心上执行
2.同步异步
同步:是指线程在访问某一资源时,获得了资源的返回结果之后才会执行其他操作(先做
某些事,再做某些事)
异步:与同步相对,是指线程再访问某一资源时,无论是否取得返回结果,都进行下一步操作;当有了资源返回结果时
系统会通知线程。
二、线程
1、threading模块介绍
python的Thread模块是比较底层的模块,Python的threading模块是对Thread做了一些包装的
可以更加方便的被使用
创建线程对象:threading.Thread(target=func)
参数target指定线程执行的任务(函数)
Thread类提供了一下方法:
方法: 说明
run() 用以表示线程活动的方法
start() 启动线程活动
join() 设置主线程会等待time秒后再往下执行,time默认为子线程结束,多个子线程
之间设置的值会叠加
isAlive() 返回线程是否活动的
getName() 返回线程名
threading.currentThread():返回当前执行的线程
threading.enumerate():返回正在运行的所有线程(list)。正在运行指线程启动后,结束前,不包括启动
前和终止后的线程
threading.activeCount():返回正在运行的线程数量
例子一:
import threading
# 创建线程
def func1(name):
print("线程一{}".format(name))
def func2():
print("线程二")
# 创建两个线程
"""
target 传入的函数名, args 函数的参数,是个元祖
"""
t1 = threading.Thread(target=func1, args=("猫咪",))
t2 = threading.Thread(target=func2)
# 启动线程1
t1.start()
print(threading.current_thread())
t1.join()
# 启动线程2
t2.start()
print(threading.current_thread(),threading.enumerate(),threading.active_count())
t2.join()
例子二:
# 创建线程的第二种写法
import requests
class ThreadRequest(threading.Thread):
# 如果写初始化函数一定要调用父类的__init__函数
def __init__(self, url):
self.url = url
super().__init__()
# 重写Thread类里面的run方法
def run(self):
res = requests.get(self.url)
print("返回状态码{}".format(res.status_code))
url = "https://123.sogou.com/"
# 创建五个线程
for i in range(5):
t = ThreadRequest(url)
t.start()
t.join()