AERBAS 2023-03-21 14:54 采纳率: 50%
浏览 23
已结题

python进程池中子进程不执行

img

请教下为什么我这段代码子进程不执行?


import time
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
from multiprocessing import cpu_count

def fun(i):
    print('{}'.format(i))
    time.sleep(1)

if __name__=='__main__':
    p =  ProcessPoolExecutor(4)
    for t in range(10):
        p.submit(fun, t)
    p.shutdown(True)
    print(cpu_count())
  • 写回答

1条回答 默认 最新

  • 瞬间的未来式 2023-03-22 01:50
    关注

    您的代码看起来没有明显的问题,但可能是由于以下原因导致子进程没有执行:

    在Windows上,必须将调用主程序的代码放在if name=='main'语句块中,否则将导致无法启动进程。
    由于您使用的是进程池,因此进程池可能会在运行时分配不同的进程来执行任务。如果您的系统中没有足够的空闲进程,则可能会导致子进程无法执行。您可以尝试使用ThreadPoolExecutor而不是ProcessPoolExecutor,以查看问题是否在进程池中。
    您的代码中的任务非常简单,可能无法看出子进程是否执行。您可以尝试将fun函数更改为输出一些更有意义的东西,例如时间戳和子进程ID等,以查看子进程是否正在运行。
    下面是一个更新后的示例代码,用于输出一些更有意义的东西,以便更好地检查子进程是否正在执行:

    import time
    import os
    from concurrent.futures import ProcessPoolExecutor
    
    def fun(i):
        print('Task {} started at {} in process {}'.format(i, time.ctime(), os.getpid()))
        time.sleep(1)
        print('Task {} finished at {} in process {}'.format(i, time.ctime(), os.getpid()))
    
    if __name__=='__main__':
        p = ProcessPoolExecutor(4)
        for t in range(10):
            p.submit(fun, t)
        p.shutdown(wait=True)
    

    请注意,我在代码中添加了os.getpid()函数,以便在每个子进程中输出其进程ID。如果运行此代码,您应该会看到输出类似于以下内容:

    Task 0 started at Mon Mar 22 10:40:11 2023 in process 1234
    Task 1 started at Mon Mar 22 10:40:11 2023 in process 1235
    Task 2 started at Mon Mar 22 10:40:11 2023 in process 1236
    Task 3 started at Mon Mar 22 10:40:11 2023 in process 1237
    Task 0 finished at Mon Mar 22 10:40:12 2023 in process 1234
    Task 4 started at Mon Mar 22 10:40:12 2023 in process 1234
    Task 1 finished at Mon Mar 22 10:40:12 2023 in process 1235
    Task 5 started at Mon Mar 22 10:40:12 2023 in process 1235
    Task 3 finished at Mon Mar 22 10:40:12 2023 in process 1237
    Task 6 started at Mon Mar 22 10:40:12 2023 in process 1237
    Task 2 finished at Mon Mar 22 10:40:12 2023 in process 1236
    Task 7 started at Mon Mar 22 10:40:12 2023 in process 1236
    Task 4 finished at Mon Mar 22 10:40:13 2023 in process 1234
    Task 8 started at Mon Mar 22 10:40
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    AERBAS 2023-03-22 14:04

    非常感谢你的解答,最后发现问题在于用pycharm时,如果用控制台运行,就不能进子进程运行,使用您代码试过了没有输出,但是直接run的话却可以运行。

    回复
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月29日
  • 已采纳回答 3月22日
  • 创建了问题 3月21日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部