0%

python | 自定义进程

有的时候,咱们也需要自定义进程。

和使用 thread 子类创建线程的方式类似,除了直接使用 Process 类创建进程,还可以通过创建 Process 的子类来创建进程。

需要注意的是,在创建 Process 的子类时,需在子类内容重写 run() 方法。实际上,该方法所起到的作用,就如同第一种创建方式中 target 参数执行的函数。

也就是当你执行 start() 的时候,就是执行 run() 的代码。

另外,通过 Process 子类创建进程,和使用 Process 类一样,先创建该类的实例对象,然后调用 start() 方法启动该进程。下面程序演示如何通过 Process 子类创建一个进程。

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
import os
from multiprocessing import Process

print("当前进程ID:", os.getpid())


# 定义一个函数,供主进程调用
def action(name, *add):
print(name)
for arc in add:
print("%s --当前进程%d" % (arc, os.getpid()))


# 自定义一个进程类
class My_Process(Process):
def __init__(self, name, *add):
super().__init__()
self.name = name
self.add = add

def run(self):
print(self.name)
for arc in self.add:
print("%s --当前进程%d" % (arc, os.getpid()))


if __name__ == '__main__':
# 定义为进程方法传入的参数
my_tuple = ("http://c.biancheng.net/python/", \
"http://c.biancheng.net/shell/", \
"http://c.biancheng.net/java/")
my_process = My_Process("my_process进程", *my_tuple)
# 启动子进程
my_process.start()
# 主进程执行该函数
action("主进程", *my_tuple)

程序执行结果为:

当前进程ID: 22240
主进程
http://c.biancheng.net/python/ --当前进程22240
http://c.biancheng.net/shell/ --当前进程22240
http://c.biancheng.net/java/ --当前进程22240
当前进程ID: 18848
my_process进程
http://c.biancheng.net/python/ --当前进程18848
http://c.biancheng.net/shell/ --当前进程18848
http://c.biancheng.net/java/ --当前进程18848

自定义进程的好处,就是可以通过初始化的时候传递参数。

你不能通过 start() 来传递给 run 的参数,但是,可以初始化的时候进行传递。

自定义编程的一个好处就是可以在内部编写函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import time
from multiprocessing import Process


# 自定义一个进程类
class My_Process(Process):

def test(self, i):
print(i)

def run(self):
for i in range(10):
self.test(i)
time.sleep(1)


if __name__ == '__main__':
# 定义为进程方法传入的参数
my_process = My_Process()
# 启动子进程
my_process.start()
my_process.join()
请我喝杯咖啡吧~