python——进程池

 

复制代码
from concurrent.futures import ProcessPoolExecutor
import os,random
def func(name):
    print("%s吃了又一碗饭:%s" %(name,os.getpid()))
    time.sleep(random.randint(1, 3))

if __name__ == "__main__":
    p = ProcessPoolExecutor(3)  #创建一个进程池,里面容纳3个进程
    for i in range(7):
        obj = p.submit(func,'科比%i'%i)
    print("主进程")

#执行结果
主进程
科比0吃了又一碗饭:14860
科比1吃了又一碗饭:4872
科比2吃了又一碗饭:15088

科比3吃了又一碗饭:14860 科比4吃了又一碗饭:14860 科比5吃了又一碗饭:14860 科比6吃了又一碗饭:4872
复制代码

再看下一个例子:

复制代码
from concurrent.futures import ProcessPoolExecutor
import os,random
def func(name):
    print("%s吃了又一碗饭:%s" %(name,os.getpid()))
    time.sleep(random.randint(1, 3))

if __name__ == "__main__":
    p = ProcessPoolExecutor(3)  #创建一个进程池,里面容纳3个进程
    for i in range(7):
        obj = p.submit(func,'科比%i'%i)
    p.shutdown(wait=True)  #类似与join,并且可以关门,以防在等的过程中又提交新的任务
    print("主进程")

#执行结果
科比0吃了又一碗饭:13980
科比1吃了又一碗饭:9636
科比2吃了又一碗饭:12660
科比3吃了又一碗饭:13980
科比4吃了又一碗饭:12660
科比5吃了又一碗饭:9636
科比6吃了又一碗饭:13980
主进程
复制代码

 

同步:执行之后等着结果

复制代码
from multiprocessing import Process
import
time,os,random def func(name,hour): print("A lifelong friend:%s,%s"% (name,os.getpid())) time.sleep(hour) print("Good bother:%s"%name) start = time.time() if __name__ == "__main__": p = Process(target=func,args=('kebi',2)) p1 = Process(target=func,args=('maoxian',1)) p2 = Process(target=func,args=('xiaoniao',3)) p_1 = [p,p1,p2] for i in p_1: i.start() #提交之后原地等着,这就是串行 i.join()
print("this is over") print(time.time() - start) #打印结果 A lifelong friend:kebi,13016 Good bother:kebi A lifelong friend:maoxian,9124 Good bother:maoxian A lifelong friend:xiaoniao,1552 Good bother:xiaoniao this is over 6.487138032913208 #一个一个执行
复制代码

串行是我们要避免的,这回浪费系统资源。

同步不代表串行,同步只是提交任务的方式。

复制代码
from concurrent.futures import ProcessPoolExecutor
import os,random,time
def func(name,i):
    print("%s吃了又一碗饭:%s" %(name,os.getpid()))
    time.sleep(random.randint(1,3))
    return i**2
obj_s = []
if __name__ == "__main__":
    p = ProcessPoolExecutor(3)  #创建一个进程池,里面容纳3个进程
    for i in range(7):
        obj = p.submit(func,'科比%i'%i,i)
        obj_s.append(obj)
    for m in obj_s:
        print(m.result())

#执行结果
科比0吃了又一碗饭:3972
科比1吃了又一碗饭:12232
科比2吃了又一碗饭:204
科比3吃了又一碗饭:12232
科比4吃了又一碗饭:204
科比5吃了又一碗饭:3972   #先执行,最后取结果结果
0
1
4
科比6吃了又一碗饭:204
9
16
25
36
复制代码

如果就像执行完了之后再打印结果

复制代码
from concurrent.futures import ProcessPoolExecutor
import os,random,time
start = time.time()
def func(name,i):
    print("%s吃了又一碗饭:%s" %(name,os.getpid()))
    time.sleep(random.randint(1,3))
    return i**2
obj_s = []
if __name__ == "__main__":
    p = ProcessPoolExecutor(3)  #创建一个进程池,里面容纳3个进程
    for i in range(7):
        obj = p.submit(func,'科比%i'%i,i)
        obj_s.append(obj)
    p.shutdown()
    for m in obj_s:
        print(m.result())

#执行结果
科比0吃了又一碗饭:16320
科比1吃了又一碗饭:12048
科比2吃了又一碗饭:1152
科比3吃了又一碗饭:16320
科比4吃了又一碗饭:12048
科比5吃了又一碗饭:1152
科比6吃了又一碗饭:16320
0
1
4
9
16
25
36
复制代码

 

posted @   明王不动心  阅读(508)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示