(更新时间)2021年3月28日 python基础知识(进程的使用)

网友投稿 532 2022-05-29

一. 进程的使用

1. 导入进程包

#导入进程包 import multiprocessing

1

2

2. Process进程类的说明

Process([group [, target [, name [, args [, kwargs]]]]])

group:指定进程组,目前只能使用None

target:执行的目标任务名

name:进程名字

args:以元组方式给执行任务传参

kwargs:以字典方式给执行任务传参

Process创建的实例对象的常用方法:

start():启动子进程实例(创建子进程)

join():等待子进程执行结束

terminate():不管任务是否完成,立即终止子进程

Process创建的实例对象的常用属性:

name:当前进程的别名,默认为Process-N,N为从1开始递增的整数

3. 多进程完成多任务的代码

import multiprocessing import time # 跳舞任务 def dance(): for i in range(5): print("跳舞中...") time.sleep(0.2) # 唱歌任务 def sing(): for i in range(5): print("唱歌中...") time.sleep(0.2) if __name__ == '__main__': # 创建跳舞的子进程 # group: 表示进程组,目前只能使用None # target: 表示执行的目标任务名(函数名、方法名) # name: 进程名称, 默认是Process-1, ..... dance_process = multiprocessing.Process(target=dance, name="myprocess1") sing_process = multiprocessing.Process(target=sing) # 启动子进程执行对应的任务 dance_process.start() sing_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

24

25

26

27

28

3. 小结

导入进程包

import multiprocessing

1

创建子进程并指定执行的任务

sub_process = multiprocessing.Process (target=任务名)

1

启动进程执行任务

sub_process.start()

1

二. 获取进程编号

1. 获取进程编号的目的

获取进程编号的目的是验证主进程和子进程的关系,可以得知子进程是由那个主进程创建出来的。

获取进程编号的两种操作

获取当前进程编号

获取当前父进程编号

2. 获取当前进程编号

os.getpid() 表示获取当前进程编号

示例代码:

import multiprocessing import time import os # 跳舞任务 def dance(): # 获取当前进程的编号 print("dance:", os.getpid()) # 获取当前进程 print("dance:", multiprocessing.current_process()) for i in range(5): print("跳舞中...") time.sleep(0.2) # 扩展:根据进程编号杀死指定进程 os.kill(os.getpid(), 9) # 唱歌任务 def sing(): # 获取当前进程的编号 print("sing:", os.getpid()) # 获取当前进程 print("sing:", multiprocessing.current_process()) for i in range(5): print("唱歌中...") time.sleep(0.2) if __name__ == '__main__': # 获取当前进程的编号 print("main:", os.getpid()) # 获取当前进程 print("main:", multiprocessing.current_process()) # 创建跳舞的子进程 # group: 表示进程组,目前只能使用None # target: 表示执行的目标任务名(函数名、方法名) # name: 进程名称, 默认是Process-1, ..... dance_process = multiprocessing.Process(target=dance, name="myprocess1") sing_process = multiprocessing.Process(target=sing) # 启动子进程执行对应的任务 dance_process.start() sing_process.start()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

(更新时间)2021年3月28日 python基础知识(进程的使用)

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

3. 获取当前父进程编号

os.getppid() 表示获取当前父进程编号

示例代码:

import multiprocessing import time import os # 跳舞任务 def dance(): # 获取当前进程的编号 print("dance:", os.getpid()) # 获取当前进程 print("dance:", multiprocessing.current_process()) # 获取父进程的编号 print("dance的父进程编号:", os.getppid()) for i in range(5): print("跳舞中...") time.sleep(0.2) # 扩展:根据进程编号杀死指定进程 os.kill(os.getpid(), 9) # 唱歌任务 def sing(): # 获取当前进程的编号 print("sing:", os.getpid()) # 获取当前进程 print("sing:", multiprocessing.current_process()) # 获取父进程的编号 print("sing的父进程编号:", os.getppid()) for i in range(5): print("唱歌中...") time.sleep(0.2) if __name__ == '__main__': # 获取当前进程的编号 print("main:", os.getpid()) # 获取当前进程 print("main:", multiprocessing.current_process()) # 创建跳舞的子进程 # group: 表示进程组,目前只能使用None # target: 表示执行的目标任务名(函数名、方法名) # name: 进程名称, 默认是Process-1, ..... dance_process = multiprocessing.Process(target=dance, name="myprocess1") sing_process = multiprocessing.Process(target=sing) # 启动子进程执行对应的任务 dance_process.start() sing_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

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

4. 小结

获取当前进程编号

os.getpid()

1

获取当前父进程编号

os.getppid()

1

获取进程编号可以查看父子进程的关系

三. 进程执行带有参数的任务

1. 进程执行带有参数的任务的介绍

前面我们使用进程执行的任务是没有参数的,假如我们使用进程执行的任务带有参数,如何给函数传参呢?

Process类执行任务并给任务传参数有两种方式:

args 表示以元组的方式给执行任务传参

kwargs 表示以字典方式给执行任务传参

2. args参数的使用

示例代码:

import multiprocessing import time # 带有参数的任务 def task(count): for i in range(count): print("任务执行中..") time.sleep(0.2) else: print("任务执行完成") if __name__ == '__main__': # 创建子进程 # args: 以元组的方式给任务传入参数 sub_process = multiprocessing.Process(target=task, args=(5,)) sub_process.start()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

3. kwargs参数的使用

示例代码:

import multiprocessing import time # 带有参数的任务 def task(count): for i in range(count): print("任务执行中..") time.sleep(0.2) else: print("任务执行完成") if __name__ == '__main__': # 创建子进程 # kwargs: 表示以字典方式传入参数 sub_process = multiprocessing.Process(target=task, kwargs={"count": 3}) sub_process.start()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

4. 小结

进程执行任务并传参有两种方式:

元组方式传参(args): 元组方式传参一定要和参数的顺序保持一致。

字典方式传参(kwargs): 字典方式传参字典中的key一定要和参数名保持一致。

四. 进程使用的相关注意点

1. 进程的注意点介绍

进程之间不共享全局变量

主进程会等待所有的子进程执行结束再结束

2. 进程之间不共享全局变量

import multiprocessing import time # 定义全局变量 g_list = list() # 添加数据的任务 def add_data(): for i in range(5): g_list.append(i) print("add:", i) time.sleep(0.2) # 代码执行到此,说明数据添加完成 print("add_data:", g_list) def read_data(): print("read_data", g_list) if __name__ == '__main__': # 创建添加数据的子进程 add_data_process = multiprocessing.Process(target=add_data) # 创建读取数据的子进程 read_data_process = multiprocessing.Process(target=read_data) # 启动子进程执行对应的任务 add_data_process.start() # 主进程等待添加数据的子进程执行完成以后程序再继续往下执行,读取数据 add_data_process.join() read_data_process.start() print("main:", g_list) # 总结: 多进程之间不共享全局变量

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

27

28

29

30

31

32

33

34

35

36

37

进程之间不共享全局变量的解释效果图:

3. 进程之间不共享全局变量的小结

创建子进程会对主进程资源进行拷贝,也就是说子进程是主进程的一个副本,好比是一对双胞胎,之所以进程之间不共享全局变量,是因为操作的不是同一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已。

4. 主进程会等待所有的子进程执行结束再结束

假如我们现在创建一个子进程,这个子进程执行完大概需要2秒钟,现在让主进程执行0.5秒钟就退出程序,查看一下执行结果,示例代码如下:

import multiprocessing import time # 定义进程所需要执行的任务 def task(): for i in range(10): print("任务执行中...") time.sleep(0.2) if __name__ == '__main__': # 创建子进程 sub_process = multiprocessing.Process(target=task) sub_process.start() # 主进程延时0.5秒钟 time.sleep(0.5) print("over") exit() # 总结: 主进程会等待所有的子进程执行完成以后程序再退出

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

保证主进程正常退出的示例代码:

import multiprocessing import time # 定义进程所需要执行的任务 def task(): for i in range(10): print("任务执行中...") time.sleep(0.2) if __name__ == '__main__': # 创建子进程 sub_process = multiprocessing.Process(target=task) # 设置守护主进程,主进程退出子进程直接销毁,子进程的生命周期依赖与主进程 # sub_process.daemon = True sub_process.start() time.sleep(0.5) print("over") # 让子进程销毁 sub_process.terminate() exit() # 总结: 主进程会等待所有的子进程执行完成以后程序再退出 # 如果想要主进程退出子进程销毁,可以设置守护主进程或者在主进程退出之前让子进程销毁

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

5. 主进程会等待所有的子进程执行结束再结束的小结

为了保证子进程能够正常的运行,主进程会等所有的子进程执行完成以后再销毁,设置守护主进程的目的是主进程退出子进程销毁,不让主进程再等待子进程去执行。

设置守护主进程方式: 子进程对象.daemon = True

销毁子进程方式: 子进程对象.terminate()

Python 任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:打破网络数据孤岛,实现AI模型共建
下一篇:JAVA笔记(一)
相关文章