使用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
相关产品推荐
相关产品推荐

