Python 多任务,进程、线程、协程

本文深入探讨了CPU中的核心概念,并详细解释了并发与并行的区别。介绍了进程作为系统分配资源的基本单位,以及线程作为调度资源的基本单位的概念。通过Python示例展示了如何创建和管理多线程,包括线程安全问题和同步锁的使用。此外,还讨论了多进程,强调了进程间通信的重要性,并提到了使用消息队列。最后,简要提及了协程在处理IO密集型任务中的优势。
摘要由CSDN通过智能技术生成

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值