记录一个python多线程的错误写法

直接先上错误代码:

复制代码
import multiprocessing

def first_way():
    init = 3
    def process_function(item):
        result = item * init
        return result

    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    pool = multiprocessing.Pool(processes=4)

    # 创建一个列表来存储每个进程的结果
    results = []

    for i in data:
        result = pool.apply_async(process_function, (i,))
        results.append(result)

    pool.close()
    pool.join()

    # 打印结果
    for result in results:
        print(result.get())  # 使用get()方法获取进程的结果

if __name__ == "__main__":
    first_way()
复制代码

这个代码的问题是:

multiprocessing.Pool 使用 pickle 来序列化和反序列化函数和参数,以便在多个进程之间传递。在这个错误代码中,process_function 函数被定义在 first_way 函数内部,这可能导致 pickle 出现问题,因为它无法序列化局部函数。

要解决这个问题,可以将 process_function 移出 first_way 函数,使其成为一个全局函数。下面是修复后的代码:

import multiprocessing

# 将 process_function 移出 first_way 函数,定义为一个全局函数
def process_function(item):
    init = 3
    result = item * init
    return result

def first_way():
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    pool = multiprocessing.Pool(processes=4)

    # 创建一个列表来存储每个进程的结果
    results = []

    for i in data:
        result = pool.apply_async(process_function, (i,))
        results.append(result)

    pool.close()
    pool.join()

    # 打印结果
    for result in results:
        print(result.get())  # 使用get()方法获取进程的结果

if __name__ == "__main__":
    first_way()

通过将 process_function 定义为全局函数,可以避免 pickle 出现问题

如果返回多个结果:

复制代码
import multiprocessing

def process_function(item):
    result1 = item * 2
    result2 = item ** 2
    return result1, result2

def main():
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    pool = multiprocessing.Pool(processes=4)

    # 创建一个列表来存储每个进程的结果
    results = []

    for i in data:
        result = pool.apply_async(process_function, (i,))
        results.append(result)

    pool.close()
    pool.join()

    # 打印结果
    for result in results:
        result1, result2 = result.get()
        print(f"Result 1: {result1}, Result 2: {result2}")

if __name__ == "__main__":
    main()
复制代码

 

posted @   海_纳百川  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2022-09-14 深度学习图像预处理时BGR2RGB的两种可用方式
2022-09-14 python-OpenCV使用CUDA处理图像
本站总访问量8959936
 
点击右上角即可分享
微信分享提示