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

多进程模块问题:如何实现多哈希进程+单求和进程的并行处理

实现多进程并行哈希处理的解决方案

我来帮你搞定这个多进程并行处理哈希的问题!先看看你现有代码里的小问题:你现在每个哈希进程都拿到了完整的words列表,这会导致所有进程重复处理相同的单词,完全没起到并行的作用。接下来我给你两种解决方案,一种是基于你现有Process+Queue的改造,另一种是更简洁的Pool实现方案,你可以根据需求选择。

方案一:改造现有Process+Queue代码

这个方案会保留你原有的队列和锁机制,主要修改任务拆分和END信号的处理逻辑:

修改后的完整代码

import multiprocessing as mp
from time import sleep
from random import random

def hasher(q, l, sub_words):
    # 每个进程只处理分配给自己的子单词列表
    for word in sub_words:
        l.acquire()
        h = hash(word)
        print(f'hash of {word} is {h}')
        l.release()
        sleep(1.0 * random())
        q.put(h)
    # 每个哈希进程处理完自己的任务后发送END信号
    q.put('END')

def summer(q, l, total_hash_processes):
    end_count = 0
    while True:
        data = q.get()
        sleep(0.1 * random())
        if data == 'END':
            end_count += 1
            # 收到所有哈希进程的END信号后退出
            if end_count == total_hash_processes:
                break
        else:
            l.acquire()
            digit_sum = sum(int(x) for x in str(abs(data)))
            print(f'sum of {data} is {digit_sum}')
            l.release()

if __name__ == '__main__':
    queue = mp.Queue()
    lock = mp.Lock()
    words = ['fwiimaafqa', 'nuwivfmgdc', 'foymwgcbut', 'sefmayofio', 'crbgzpihpa', 
             'xsioddsfyw', 'zbefmckkyi', 'vkxymewyvt', 'ryrvrfkjqf', 'zobdvstxfh']
    
    # 设置哈希进程的数量
    hash_process_num = 3
    bots = []
    
    # 拆分单词列表,分给每个哈希进程
    chunk_size = len(words) // hash_process_num
    for i in range(hash_process_num):
        # 处理最后一个进程可能多出来的单词
        if i == hash_process_num - 1:
            sub_words = words[i*chunk_size:]
        else:
            sub_words = words[i*chunk_size : (i+1)*chunk_size]
        # 创建并启动哈希进程
        bot = mp.Process(target=hasher, args=(queue, lock, sub_words))
        bot.start()
        bots.append(bot)
    
    # 启动求和进程,传入哈希进程总数
    bot2 = mp.Process(target=summer, args=(queue, lock, hash_process_num))
    bot2.start()
    
    # 等待所有哈希进程结束
    for bot in bots:
        bot.join()
    # 等待求和进程结束
    bot2.join()

关键改动说明

  • 任务拆分:把words列表拆分成多个子列表,每个哈希进程只处理自己的子列表,避免重复计算。
  • END信号计数:求和进程需要知道总共有多少个哈希进程,只有收到对应数量的END信号后才会退出,确保所有哈希结果都被处理。
  • 锁的正确使用:保持锁来同步打印操作,避免输出混乱。

方案二:用Pool实现更简洁的并行处理

如果你不需要实时把哈希结果传给求和进程,而是等所有哈希计算完成后再统一处理,用multiprocessing.Pool会更简洁,它会自动帮你管理进程和收集结果:

完整代码

import multiprocessing as mp
from time import sleep
from random import random

def hash_single(word):
    # 单个单词的哈希计算,模拟耗时
    sleep(1.0 * random())
    h = hash(word)
    print(f'hash of {word} is {h}')
    return h

def summer(hash_results):
    # 批量处理哈希值的求和
    for h in hash_results:
        sleep(0.1 * random())
        digit_sum = sum(int(x) for x in str(abs(h)))
        print(f'sum of {h} is {digit_sum}')

if __name__ == '__main__':
    words = ['fwiimaafqa', 'nuwivfmgdc', 'foymwgcbut', 'sefmayofio', 'crbgzpihpa', 
             'xsioddsfyw', 'zbefmckkyi', 'vkxymewyvt', 'ryrvrfkjqf', 'zobdvstxfh']
    
    # 创建进程池,设置并行进程数
    with mp.Pool(processes=3) as pool:
        # 并行处理所有单词的哈希计算,收集结果
        hash_results = pool.map(hash_single, words)
    
    # 单进程处理求和
    summer(hash_results)

为什么这个方案更简洁?

  • Pool.map会自动把任务分配给多个进程,完成后统一返回结果列表,不需要手动管理队列和信号。
  • 代码结构更清晰,适合这种批量处理、不需要实时交互的场景。
  • 自动处理进程的创建和销毁,减少手动管理的复杂度。

你可以根据自己的实际需求选择方案:如果需要哈希计算完成一个就处理一个求和,选方案一;如果可以等所有哈希计算完再统一求和,方案二更省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:29:22