并发编程
多道分时技术
多道技术就是允许多个程序同时进入内存并运行,交叉使用CPU。
分时技术:把处理机的运行时间分成很短的时间片,按时间片轮流分配给各个联机作业使用。若
特点:1. 若CPU遇到IO操作,会立即将当前执行程序的CPU使用权断开
- 当CPU分配给程序的片使用时间结束,将当前程序的使用权断开,等待下次执行
并发与并行
并发:多个程序对CPU和IO的使用不停切换,像多个程序在一起运行
并行:真正意义上的同时运行,在多核CPU下的情况下,同时执行多个程序
进程的三种状态
就绪,运行态,阻塞态
同步和异步
指的任务提交的方式,
同步:提交下一个任务时,必须等待第一个任务执行完毕
异步:可同时提交多个任务
阻塞和非阻塞
针对的是进程,当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程
https://blog.csdn.net/likunshan/article/details/82224367
子进程和父进程关联
- 让父进程在子进程结束后再结束,用join
- 让父进程结束时,子进程也结束,用守护进程
父进程回收子进程的两种方式:
调用join或等待父进程正常结束
兄弟进程控制和通信
互斥
互斥锁:
from multiprocessing import Process, Lock
import json
def change_file(mutex):
mutex.acuire()
with open("data.txt", "r") as f:
dic = json.load(f)
dic.["num"] -= 1
with open("data.txt", "w") as f:
json.dump(dic, f)
mutex.releas()
if __name__ = "__main__":
mutex = Lock()
for i in range(20):
p = Process(target=change_file, args=(mutex,))
信息共享
队列:
from multiprocessing import Process, Queue
import time
# 用Queue解决生产者消费者问题
def add_data(q):
time.sleep(3) # 等待
q.put(1)
def get_data(q):
print(q.get()) # 会等待队列中已存入数据后再执行
if __name__ == "__main__":
q = Queue(5)
p1 = Process(target=add_data, args=(q,))
p2 = Process(target=get_data, args=(q,))
p2.start()
p1.start()
线程
在支持线程的操作系统中,线程是CPU调度的基本单位,进程是资源分配单位
线程与进程的区别
- 一个进程可包含多个线程
- 进程开启会重新分配内存资源
- 线程间是共享同一进程的数据资源的
线程与主进程,兄弟线程之间的互斥操作同类似进程间的操作
GIL全局锁
- 本质上是一个互斥锁
- 为了保证只有一个线程运行
在python中计算密集型使用多进程,IO密集型使用多线程
Gevent模块
from gevent import monkey; monkey.patch_all()
import gevent
import time
def func():
print("1")
time.sleep(1)
def func2():
print("2")
time.sleep(2)
print("func 2")
f1 = gevent.spawn(func)
f2 = gevent.spawn(func2)