You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用fork()创建多进程实现并行质数判断与计数需求

嘿,你的思路完全没问题——把输入拆成单个数字令牌来分发任务,正是多进程处理这类问题的合理切入点。我给你整理了一个完整的实现方案,用Python来写的(它的multiprocessing模块能轻松搞定进程间通信和共享内存),完全符合你的需求:

多进程并行质数判断+共享计数实现方案

核心思路拆解

我们需要三个关键组件来实现需求:

  • 进程安全的任务队列:让4个工作进程能安全地“抢”未处理的数字,避免重复或遗漏
  • 共享内存计数器:所有进程共用一个计数器,统计质数数量,必须保证修改时的原子性
  • 质数判断逻辑:单独抽成函数,让每个进程可以独立调用

完整代码示例

import multiprocessing
import math

def is_prime(n):
    """判断单个数字是否为质数的辅助函数,做了基础优化"""
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    # 只需要检查到平方根,减少循环次数
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

def worker(task_queue, prime_counter, lock):
    """工作进程的核心逻辑:取任务、判质数、更改进计数器"""
    while True:
        try:
            # 非阻塞从队列拿任务,空队列时直接退出
            num = task_queue.get(block=False)
            if is_prime(num):
                # 加锁!避免多个进程同时改计数器导致的竞态问题
                with lock:
                    prime_counter.value += 1
            task_queue.task_done()
        except multiprocessing.queues.Empty:
            # 没任务了,直接结束进程
            break

if __name__ == "__main__":
    # 1. 处理输入:把空格分隔的字符串拆成整数列表
    input_str = input("请输入若干以空格分隔的数字:")
    try:
        numbers = list(map(int, input_str.split()))
    except ValueError:
        print("输入格式不对哦,请输入整数,用空格分开~")
        exit(1)
    
    # 2. 初始化进程间通信组件
    # 任务队列:把所有待处理数字放进去
    task_queue = multiprocessing.Queue()
    for num in numbers:
        task_queue.put(num)
    
    # 共享计数器:用'int'类型,初始值0,存在共享内存里
    prime_counter = multiprocessing.Value('i', 0)
    
    # 互斥锁:保证计数器修改的原子性
    lock = multiprocessing.Lock()
    
    # 3. 启动4个工作进程
    processes = []
    for _ in range(4):
        p = multiprocessing.Process(target=worker, args=(task_queue, prime_counter, lock))
        processes.append(p)
        p.start()
    
    # 4. 等所有进程干完活
    for p in processes:
        p.join()
    
    # 5. 输出结果
    print(f"输入的数字里,一共有 {prime_counter.value} 个质数!")

关键细节说明

  • 任务队列的安全性:multiprocessing.Queue本身就是进程安全的,多个进程同时调用get()不会出现重复拿同一个数字的情况,队列为空时进程自动退出,完美实现“自动取下一个未处理数字”的需求。
  • 共享计数器的锁:必须用lock来包裹计数器的修改操作,不然多个进程同时改的话,会出现计数错误(比如两个进程同时读了0,然后都加1,结果还是1,而不是2)。
  • 质数判断的优化:排除了小于2的数、偶数,只检查到平方根,能大幅提升大数字的判断速度。

扩展小建议

  • 如果要处理超级多的数字,可以给队列设个最大长度,避免占太多内存。
  • 要是想加进度条,可以再搞个共享变量记录已处理的数字数量,主进程定期读取显示。
  • 要是用C/C++写的话,思路是一样的:用共享内存存计数器,用消息队列/管道分发任务,用互斥锁保证计数安全。

内容的提问来源于stack exchange,提问作者fdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:11:33