多进程的三种实现方式

一、多进程的创建方式

  1、通过multiprocessing

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#encoding='utf-8'
from multiprocessing import Process
import os
import time
 
'''
os.getpid()
获取一个进程的pid
返回当前进程的pid
 
os.getppid()
获取父进程的pid
返回父进程的pid
'''
 
 
'''
Process类的实例常用的属性和方法有:
name :           当前进程的实例别名,默认为Process-N ,N为从1开始递增的整数
pid:             当前进程实例的pid
is_alive():      判断进程实例是否还在执行
join([timeout]): 是否等待进程实例执行结束,或等待多少秒
start():         启动进程实例(创建子进程)
run():           如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法
terminate():     不管任务是否完成,立即终止
'''
 
 
 
def child_1(interval):
    print("子进程(%s)开始执行,父进程为(%s)" %(os.getpid(),os.getppid()))
    t_start = time.time()
    time.sleep(interval)
    t_end = time.time()
    print("子进程(%s)执行时间为'%0.2f'秒" % (os.getpid(),t_end-t_start))
 
def child_2(interval):
    print("子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid()))
    t_start = time.time()
    time.sleep(interval)
    t_end = time.time()
    print("子进程(%s)执行时间为'%0.2f'秒" % (os.getpid(), t_end - t_start))
 
if __name__ == '__main__':
    print("----父进程开始执行----")
    print("父进程PID:%s" % os.getpid())
    p1 = Process(target=child_1,args=(1,))
    p2 = Process(target=child_1,name="test",args=(2,))
    p1.start()
    p2.start()
 
    print("p1.is_alive = %s" % p1.is_alive())
    print("p2.is_alive = %s" % p2.is_alive())
 
    print("p1.name = %s" % p1.name)
    print("p1.pid = %s" % p1.pid)
    print("p2.name = %s" % p2.name)
    print("p2.pid = %s" % p2.pid)
 
    print("----等待子进程----")
    p1.join()
    p2.join()
    print("----父进程结束---")

  

  

        

 

 

 

  2、继承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
37
38
39
40
#encoding=utf-8
from multiprocessing import Process
import time
import os
 
class SubProcess(Process):
    def __init__(self, interval, name=''):
        Process.__init__(self)      # 调用父类的初始化方法
        self.interval = interval
        if name:
            self.name = name
 
    # 重写 run() 方法
    def run(self):
        print("子进程 (%s) 开始执行,父进程为 (%s)" % (os.getpid(), os.getppid()))
        t_start = time.time()
        time.sleep(self.interval)
        t_end = time.time()
        print("子进程 (%s) 执行结束,耗时%0.2f秒" % (os.getpid(), t_end - t_start))
 
if __name__ == '__main__':
    print("---父进程开始执行---")
    print("父进程 PID: %s" % os.getpid())
    p1 = SubProcess(interval=1, name='test')
    p2 = SubProcess(interval=2)
    p1.start()  # 对一个不包含 target 属性的 Process 类执行 start() 方法,就会运行这个类中的 run() 方法
    p2.start()
 
    print("p1.is_alive = %s" % p1.is_alive())
    print("p2.is_alive = %s" % p2.is_alive())
 
    print("p1.name = %s" % p1.name)
    print("p1.pid = %s" % p1.pid)
    print("p2.name = %s" % p2.name)
    print("p2.pid = %s" % p2.pid)
 
    print("---等待子进程---")
    p1.join()
    p2.join()
    print("---父进程执行结束---")

  

      

 

   3、使用进程池 Pool 创建进程

 

  

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
#encoding=utf-8
from multiprocessing import Pool
import time
import os
 
 
'''
Pool常用方法
apply_async(func[, args[, kwds]]) :
    使用非阻塞方式调用
    func 函数(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),
    args 为传递给
    func 的参数列表,
    kwds 为传递给 func 的关键字参数列表
 
apply(func[, args[, kwds]]):
    使用阻塞方式调用 func 函数
     
close() :
    关闭 Pool,使其不再接受新的任务
     
terminate():
    不管任务是否完成,立即终止
 
join():
    主进程阻塞,等待子进程的退出,必须在 close 或 terminate 之后使用
'''
 
 
def task(name):
    print("子进程 (%s) 开始执行 task %s..." % (os.getpid(), name))
    time.sleep(1)       # 休眠 1 秒
 
if __name__ == '__main__':
    print("---父进程开始执行---")
    print("父进程 PID: %s" % os.getpid())
    p = Pool(3)         # 定义一个进程池,最大进程数为 3
    for i in range(10):
        p.apply_async(task, args=(i,))  # 使用非阻塞方式调用 task() 函数
 
    print("等待所有子进程结束")
    p.close()
    p.join()
    print("---父进程执行结束---")

  

 

 

 

 

 

 

 

 

 

 

  

posted @   山水无期  阅读(492)  评论(0编辑  收藏  举报
编辑推荐:
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· C# 深度学习框架 TorchSharp 原生训练模型和图像识别
阅读排行:
· 这或许是全网最全的 DeepSeek 使用指南,95% 的人都不知道的使用技巧(建议收藏)
· 拒绝繁忙!免费使用 deepseek-r1:671B 参数满血模型
· 本地搭建DeepSeek和知识库 Dify做智能体Agent(推荐)
· Sdcb Chats 重磅更新:深度集成 DeepSeek-R1,思维链让 AI 更透明!
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
点击右上角即可分享
微信分享提示