吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1139|回复: 8
收起左侧

[已解决] python多进程问题

[复制链接]
1097758887 发表于 2022-11-6 18:03
本帖最后由 1097758887 于 2022-11-12 20:42 编辑

如何实现同时启动10个子进程,然后如果有一个子进程运行结束后再启动一个新的子进程。使进程池的数量一直是保持10个进程运行


[Python] 纯文本查看 复制代码
import time
import multiprocessing

def fun_c():
    time.sleep(3)
    print('进程结束')

if __name__ == '__main__':
    print('主进程开始')
    multiprocessing.freeze_support()
    q = multiprocessing.Queue()
    p = multiprocessing.Pool(10)
    for i in range(10):
        p.apply_async(fun_c)
    p.close()
    p.join()
    print("主进程结束")


顺便问一句,多进程的cpu占用怎么这么大

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
坚强的阿飘 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

GMCN 发表于 2022-11-6 18:15
你这个pool就满足你这个要求啊,永远是10个的话,你可以在主程序写一个循环,判断pool里面的个数,如果少了就再开一个

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
1097758887 + 1 + 1 正解阿

查看全部评分

 楼主| 1097758887 发表于 2022-11-6 18:23
GMCN 发表于 2022-11-6 18:15
你这个pool就满足你这个要求啊,永远是10个的话,你可以在主程序写一个循环,判断pool里面的个数,如果少了 ...

[Python] 纯文本查看 复制代码
import time
import multiprocessing

def fun_c():
    time.sleep(3)
    print('进程结束')

if __name__ == '__main__':
    print('主进程开始')
    multiprocessing.freeze_support()
    q = multiprocessing.Queue()
    p = multiprocessing.Pool(10)
    while True:
        while len(p._cache)<10:
            print(len(p._cache))
            p.apply_async(fun_c)
xhtdtk 发表于 2022-11-6 18:15
你的pool用法就是正确的,去掉p.close和p.join,range(10)改为range(100)就好
unmask 发表于 2022-11-6 18:21
线程池pool就是你想要的,一直维持最大进程数,如果有进程结束,同时还有未消费的task,会自动开启新的进程消费,一直保持最大进程数,直到所有的task全部结束。
w759003376 发表于 2022-11-6 22:42
1097758887 发表于 2022-11-6 18:23
[mw_shl_code=python,true]import time
import multiprocessing

个人觉得 这种循环判断子进程数量可以通过子进程结束后主动通知然后再启动新的子进程替代应该会更好
 楼主| 1097758887 发表于 2022-11-6 23:26
w759003376 发表于 2022-11-6 22:42
个人觉得 这种循环判断子进程数量可以通过子进程结束后主动通知然后再启动新的子进程替代应该会更好

涉及到了两个问题:
1.子进程异常结束怎么处理
2.如何通知
xixiayuchao 发表于 2022-11-7 11:50
[Python] 纯文本查看 复制代码
import time
import multiprocessing


def fun_c(id):
    print('进程(%d)开始' % (id))
    time.sleep(3)
    print('进程(%d)结束' % (id))


if __name__ == '__main__':
    print('主进程开始')
    multiprocessing.freeze_support()
    q = multiprocessing.Queue()
    p = multiprocessing.Pool(10)
    count = 0
    while True:
        p.apply_async(fun_c, (count,))
        count += 1
    p.close()
    p.join()
    print('主进程结束')


其实也不需要判断Pool cache, 当达到设定大小时,新的创建会被阻塞
https://docs.python.org/3/library/multiprocessing.html
yy17312 发表于 2022-11-10 18:58
进程池本来就有这样的效果,最多同时运行10个进程,多余的进程会添加进队列中,其中一个进程执行完毕之后会从队列中移除一个任务添加进池中。进程池非常耗费资源,建议用线程池,占用的资源会降低很多,但是可以达到同样的效果
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 06:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表