cpu中计算的东西叫做 核心
一个核 同一时刻 只能做一件事情
例子:把教室看做一个cpu,教室中有一个人,这个人看做 核心
并行:多个任务同时执行,真正的多任务
并发:假的多任务,依靠时间片轮询,让多个任务随机分配时间执行
时间片轮询机制:cpu给多个任务随机分配执行时间去执行,
由于cpu执行速度非常快,以致于我们认为多个任务在同时执行
进程:一个运行起来的程序就是进程
运行起来的程序:源代码 以及 需要的资源(内存,摄像头,麦克风等)
进程是系统分配资源的基本单位
多进程:多个运行起来的程序
线程:线程是进程的一个实例,他是执行程序的最小单位
一个进程中至少有一个线程
线程是调度资源的基本单位
多线程:一个进程中有多个线程
1.多线程及参数问题
#使用多线程
import threading
def sing(a):
for i in range(a):
print(i,"唱歌")
time.sleep(1)
def dance():
for i in range(5):
print(i,"跳舞")
time.sleep(1)
if __name__ == '__main__':
t1 = threading.Thread(target=sing,args=(5,))
t2 = threading.Thread(target=dance)
t1.start()
t2.start()
2.让主线程等待子线程结束后再结束
t1.join() #主线程等待 子线程运行结束后再运行,
t2.join(9) # 参数:主线程等待子线程的最大时间
3.守护线程:子线程随着主线程的结束而结束
t1.setDaemon(True)
t2.setDaemon(True)
4.获取及设置主线程名字:
thr = threading.currentThread()
thr.setName("主线程")
na = thr.getName()
5.返回正在运行的线程列表:
tr_li = threading.enumerate()
tr_li[0].setName("新名字")
线程安全
多个线程共享全局变量
所有的资源都在进程中,多个线程大部分数据都是共享的进程中的资源
线程独有的资源非常少
1.使用同步锁解决多线程共享全局变量
#创建一个锁对象
lock = threading.Lock()
#加锁
lock.acquire()
#解锁
lock.release()
进程
#使用多进程
import multiprocessing,time
#创建一个子进程
p1 = multiprocessing.Process(target=calculate,args=(5,))
p2 = multiprocessing.Process(target=calculate,args=(6,))
创建子进程的时候会将主进程的数据复制一份,作为子进程自己的资源
进程与进程之间的通信,使用消息队列
特点:排队,先进先出
如果使用列表实现队列:
队列 末尾追加 append()
取第一个 pop(0)
栈:先进后出
# 创建一个队列,参数:最多可以存几个值,可以看做一个先进先出的列表
que = multiprocessing.Queue()
# 写入队列
que.put(i)
# 返回队列大小
que.qsize()
# 获取队列
que.get()
cpu密集型 : cpu 一直在计算
io密集型 : 有阻塞
协程
导包
import gevent
from gevent import monkey
# 将其他模块中的耗时操作转换成 gevent 模块中的耗时操作
monkey.patch_all()
#创建协程:给主线程添加两个任务
g1 = gevent.spawn(sing)
g2 = gevent.spawn(dance)
如果某个任务没有耗时操作,则执行结束后再执行下一个任务
读取网页内容
import urllib.request
url = "http://pic1.win4000.com/wallpaper/c/53cdd1f7c1f21.jpg"
cont = urllib.request.urlopen(url)
img = cont.read()