ToB企服应用市场:ToB评测及商务社交产业平台

标题: python多线程中一种错误的写法 [打印本页]

作者: 祗疼妳一个    时间: 2024-1-5 22:05
标题: python多线程中一种错误的写法
直接先上错误代码:
  1. import multiprocessing
  2. def first_way():
  3.     init = 3
  4.     def process_function(item):
  5.         result = item * init
  6.         return result
  7.     data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  8.     pool = multiprocessing.Pool(processes=4)
  9.     # 创建一个列表来存储每个进程的结果
  10.     results = []
  11.     for i in data:
  12.         result = pool.apply_async(process_function, (i,))
  13.         results.append(result)
  14.     pool.close()
  15.     pool.join()
  16.     # 打印结果
  17.     for result in results:
  18.         print(result.get())  # 使用get()方法获取进程的结果
  19. if __name__ == "__main__":
  20.     first_way()
复制代码
这个代码的问题是:
multiprocessing.Pool 使用 pickle 来序列化和反序列化函数和参数,以便在多个进程之间传递。在这个错误代码中,process_function 函数被定义在 first_way 函数内部,这可能导致 pickle 出现问题,因为它无法序列化局部函数。
要解决这个问题,可以将 process_function 移出 first_way 函数,使其成为一个全局函数。下面是修复后的代码:
  1. import multiprocessing
  2. # 将 process_function 移出 first_way 函数,定义为一个全局函数
  3. def process_function(item):
  4.     init = 3
  5.     result = item * init
  6.     return result
  7. def first_way():
  8.     data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  9.     pool = multiprocessing.Pool(processes=4)
  10.     # 创建一个列表来存储每个进程的结果
  11.     results = []
  12.     for i in data:
  13.         result = pool.apply_async(process_function, (i,))
  14.         results.append(result)
  15.     pool.close()
  16.     pool.join()
  17.     # 打印结果
  18.     for result in results:
  19.         print(result.get())  # 使用get()方法获取进程的结果
  20. if __name__ == "__main__":
  21.     first_way()
复制代码
通过将 process_function 定义为全局函数,可以避免 pickle 出现问题
如果返回多个结果:
  1. import multiprocessing
  2. def process_function(item):
  3.     result1 = item * 2
  4.     result2 = item ** 2
  5.     return result1, result2
  6. def main():
  7.     data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  8.     pool = multiprocessing.Pool(processes=4)
  9.     # 创建一个列表来存储每个进程的结果
  10.     results = []
  11.     for i in data:
  12.         result = pool.apply_async(process_function, (i,))
  13.         results.append(result)
  14.     pool.close()
  15.     pool.join()
  16.     # 打印结果
  17.     for result in results:
  18.         result1, result2 = result.get()
  19.         print(f"Result 1: {result1}, Result 2: {result2}")
  20. #学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
  21. if __name__ == "__main__":
  22.     main()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4