多任务指的就是在同一时间内执行多个任务。
多任务的执行方式:
1.并发:在一段时间内交替执行任务
2.并行:多核CPU处理多任务
进程:
进程使用步骤:
1.导入进程包multiprocessing
** 导入import time **
2.创建进程 main函数
3.启动进程
time.sleep(n) 让进程休眠n秒,自动失去CPU资源
target 获取当前任务名称
name 获取当前进程
multiprocessing.current_process() 获取当前进程对象
1.进程之间不共享全局变量
2.获取进程编号:
2.1 getpid 获取子进程编号
2.2 getppid 获取父进程编号
3.进程传参:
3.1 args=()元组类型
3.2 kwargs={}字典类型
4.主进程会等待所有子进程结束后再结束(想让子进程随着主进程的结束而结束)
4.1 设置terminate(),让进程结束
sub_process.terminate()
4.2 设置子进程为daemon进程,必须在start之前
sub_process.daemon = True
线程:
线程的使用步骤:
1.导入线程包 import threading import time
2.创建线程
3.启动线程
1.target\name 与进程一样
2.主线程会等待所有子线程结束后再结束,需要将子线程设置为daemon线程,设置方法有2种
2.1 在创建线程对象的时候,添加daemon参数
sub_thread = threading.Thread(target=函数名, daemon=True)
2.2 在创建线程之后,start之前,设置daemon属性
sub_thread.setDaemon(True)
3.线程传参与进程使用方法一致
4.线程的执行是无序的
5.线程共享全局变量
5.1 sub_thread1.join()
5.2 join(timeout) 如果给定timeout值,未能在规定的时间内完成任务,则不会再继续等待,而是去执行下面的任务;如果能在给定的时间内完成任务,则效果跟没有给定值的效果是一样的
6.针对全局变量产生的错误,使用互斥锁或同步线程来解决
7.互斥锁:
7.1 创建锁 mutex = threading.Lock()
7.2 上锁 mutex.acquire()
7.3 解锁 mutex.release()
8.死锁
9.获取线程编号
简单实现进程的小demo:

简单实现线程的小demo:

demo结果:

进程升级版演示:
import multiprocessing
import time
import os
def dance():
print('dance', os.getpid()) # 获取当前进程编号
print('dance', multiprocessing.current_process()) # 获取当前进程
print('dance的父进程编号:', os.getppid())
......
if __name__ == '__main__':
print('main:', os.getpid())
print('main:', multiprocessing.current_process())
dance_process = multiprocessing.Process(target=dance, name='myprocess1')
dance_process.start()
- 总结:
1.线程是依附在进程里面的,没有进程就没有线程。
2.一个进程默认提供一条线程,进程可以创建多个线程。
3.进程之间是不共享全局变量的。
4.线程之间是共享全局变量,但是要注意资源竞争的问题,可以使用互斥锁或者线程同步来解决。
5.创建进程的资源开销要比创建线程的资源开销大。
6.进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位。
7.线程不能够独立执行,必须依附在进程中。
8.多进程开发比单进程多线程开发稳定性要强。
9.进程和线程都是完成多任务的一种方式。
10.多进程要比多线程消耗的资源多,但是多进程开发比单进程多线程开发稳定性要强,某个进程挂掉也不会影响其它进程。
11.多进程可以使用cpu的多核运行,多线程可以共享全局变量。
884

被折叠的 条评论
为什么被折叠?



