多任务
两种多任务形式:
- 并发:在一段时间交替去执行多个任务;并发数量大于CPU的核心数
- 并行:在一段时间内真正的一起执行多任务;任务数量小于等于CPU核心数
进程
在python中实现多任务采用进程,进程是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位。
多进程的作用:
- 程序运行会默认创建一个进程,这个默认创建的进程称之为主进程
- 程序运行后又创建了一个进程,这个进程称之为子进程
多进程完成多任务
进程创建步骤:
1.导入进程包
2.通过进程类创建进程对象
1 2 3 4
| 进程对象=multiprocessing.Process(参数)
|
3.启动进程执行任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import time import multiprocessing
def coding(): for i in range(3): print("coding...") time.sleep(0.8)
def coding1(): for i in range(3): print("coding1...") time.sleep(0.8)
if __name__ == '__main__': coding_process = multiprocessing.Process(target=coding) coding1_process = multiprocessing.Process(target=coding1) coding_process.start() coding1_process.start()
|
进程执行带有参数的任务:
1 2
| coding_process=multiprocessing.Process(target=coding,args=(3,))
|
1 2
| coding_process=multiprocessing.Process(target=coding,kwargs={"num":3})
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import time import multiprocessing
def coding(num,name): for i in range(num): print(name) print("coding...") time.sleep(0.8)
def coding1(count): for i in range(count): print("coding1...") time.sleep(0.8)
if __name__ == '__main__': coding_process = multiprocessing.Process(target=coding, args=(3,"nice")) coding1_process = multiprocessing.Process(target=coding1,kwargs={"count":2}) coding_process.start() coding1_process.start()
|
获取进程编号:
1.获取当前进程号
1 2
| import os print(os.getpid)
|
2.获取父进程编号
1 2
| import os print(os.getppid)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import time import multiprocessing import os
def coding(num,name): for i in range(num): print(name) print("当前子进程号为:",os.getpid()) print("当前父进程号为:",os.getppid()) print("coding...") time.sleep(0.8)
def coding1(count): for i in range(count): print("coding1...") time.sleep(0.8)
if __name__ == '__main__': print("主进程的进程号:",os.getpid()) coding_process = multiprocessing.Process(target=coding, args=(3,"nice")) coding1_process = multiprocessing.Process(target=coding1,kwargs={"count":2}) coding_process.start() coding1_process.start()
|
进程间不共享全局变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import multiprocessing import time
my_list = []
def write_list(): for i in range(3): my_list.append(i) print("add:",i) print("write_data:",my_list)
def read_list(): print("read_data:",my_list)
if __name__ == '__main__': write_process=multiprocessing.Process(target=write_list) read_process=multiprocessing.Process(target=read_list) write_process.start() time.sleep(1) read_process.start()
|
上面的三个进程(一个主进程,两个子进程)分别操作的都是自己进程里面的全局变量my_list,不会对其他进程里的全局变量产生影响,所以进程之间不共享全局变量,只不过继承之间的全局变量名相同而已,但是操作的不是同一个基础南横里面的全局变量。创建子进程会对主进程资源进行拷贝
子进程和主进程的结束顺序:
- 主进程会等待所有的子进程执行结束再结束
- 设置守护主进程,主进程退出后子进程直接销毁,不再执行子进程中的代码
上面两种结果相同