python多任务及进程

多任务

两种多任务形式:

  • 并发:在一段时间交替去执行多个任务;并发数量大于CPU的核心数
  • 并行:在一段时间内真正的一起执行多任务;任务数量小于等于CPU核心数

进程

在python中实现多任务采用进程,进程是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位。

多进程的作用:
  • 程序运行会默认创建一个进程,这个默认创建的进程称之为主进程
  • 程序运行后又创建了一个进程,这个进程称之为子进程

多进程完成多任务

进程创建步骤:

1.导入进程包

1
import multiprocessing

2.通过进程类创建进程对象

1
2
3
4
进程对象=multiprocessing.Process(参数)
# 参数:
# target执行发目标任务名,这里之的是函数名(方法名)
# name,group

3.启动进程执行任务

1
进程对象.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 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)
# target所指向的函数名不加括号
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,不会对其他进程里的全局变量产生影响,所以进程之间不共享全局变量,只不过继承之间的全局变量名相同而已,但是操作的不是同一个基础南横里面的全局变量。创建子进程会对主进程资源进行拷贝

子进程和主进程的结束顺序:
  • 主进程会等待所有的子进程执行结束再结束
  • 设置守护主进程,主进程退出后子进程直接销毁,不再执行子进程中的代码
1
子进程名.daemon=True
  • 主动销毁子进程
1
子进程名.terminate()

上面两种结果相同


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!