1 vim编辑器
一开始进入是
命令模式 i ==> 编辑模式 esc ==> 命令模式
命令模式 : ==> 末行模式 esc ==> 命令模式
-
安装命令: sudo apt-get install
-
卸载命令: sudo apt-get remove
2 多任务
多任务: 在同一时间内执行多个任务
多任务的目的: 多任务的最大好处是充分利用CPU资源,提高程序的执行效率
2.1 并发:
在一段时间内交替去执行多个任务(只有一个cpu)
2.2 并行
在同一时刻执行多个任务(多核cpu)
3 多进程(多任务的实现方式)
-
进程: 在<运行>程序就是进程
-
进程: 分配资源的最小单位
-
线程: 使用资源的最小单位
3.1 多进程的使用流程
- 导入模块(multiprocesing)
- 创建子进程(Process)
- 开启子进程(start)
3.2 进程编号
目的: 知道子进程是由哪个主进程创建的(子进程需要主进程回收资源)
os.getpid() 表示获取当前进程编号
os.getppid() 表示获取当前父进程编号
3.3 获取进程名字
- 进程起名字
my_dance = multiprocessing.Process(target=dance, name=“老王”)
- 获取进程的名字
multiprocessing.current_process()
3.4 执行带有参数的任务
#带有参数的函数:
args: 元组!!!(单个元素的元组有 , )
my_dance = multiprocessing.Process(target=dance, args=(5,))
kwargs: 字典!!!(key值要和函数中的形参完全重名)
my_dance = multiprocessing.Process(target=dance, kwargs={
"count": 5})
3.5 多进程的注意点
- 进程是分配资源的最小单位==> 每个进程(主进程 子进程)都会有自己的独立的空间
结论: 进程之间不共享全局变量
- 主进程默认会等待子进程结束之后再结束
- 若想让子进程随着主进程的结束而结束,可用下面两个方法:
(1) 守护进程(在start之前设置)
my_func.daemon = True
(2) 手动结束子进程
my_func.terminate()
4 多线程(多任务实现的方式)
4.1 进程和线程的从属关系
线程是使用资源的最小单位 ==> 依附于进程
4.2 多线程的使用
- import threading
- threading.Thread(target=dance)
- start()
4.3 多线程的注意点
- 线程之间是无序执行的
- 主线程会等待子线程的结束而结束
可设置守护线程
(1) Thread(target=func, daemon=True)
(2) my_func.setDaemon(True)
- 线程之间共享全局变量
结论:由于线程是依附于进程的, 一个进程中的所有的线程都是使用的同一片内存空间 ; 一个进程中的线程是共享全局变量的;
4. 线程间共享全局变量问题
解决方法2中
(1) join
(2)互斥锁:
对共享数据进行锁定,保证同一时刻只能有一个线程去操作
- 互斥锁的使用
# 1 创建锁
mutex = threading.Lock()
# 2 上锁
mutex.acquire()
# 3 释放锁
mutex.release()
注意: 要避免死锁,且同一把锁只有解锁了以后才可以再上锁