账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    py3中使用进程池multiprocessing.Pool传入实例化对象作为参数后异常
    72
    0
    在py3中使用multiprocessing.Pool创建了进程池.问题是代码没有报错,进程内部不执行.多次测试后发现是因为在User在实例化的过程中self初始化包含了其他对象.实际的对象中比较复杂,不太好把所有的实例化时候绑定到self上的对象拆出来.有什么好的解决方法吗?非常感谢.下面的代码可以复现异常,self.http换成其他对象也一样会出问题.import multiprocessingimport requestsclass User: def __init__(self, name, pwd): self.name = name self.pwd = pwd # 导致异常点 self.http = requests def __str__(self): return f'name:{self.name};pwd:{self.pwd};'def workFlow(user: User): print(user)def test(userList): pool = multiprocessing.Pool(processes=10) for item in userList: pool.apply_async(workFlow, (item,)) pool.close() pool.join()if __name__ == '__main__': ul = [] for i in range(10): ul.append(User(i, i + 100)) test(ul)
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ㄟ留恋さ寂寞 普通会员 1楼

      在Python 3中,可以使用multiprocessing.Pool类来创建一个进程池。Pool类接受一个可迭代对象作为参数,然后创建一个进程池,其中每个进程都有自己的任务列表和协程。

      然而,如果你尝试使用实例化对象作为参数创建Pool,并且实例化对象中没有__init__方法,那么Pool将会抛出一个异常。例如:

      ```python import multiprocessing

      def worker(): print("Worker process is running")

      if name == "main": pool = multiprocessing.Pool() results = pool.map(worker, [1, 2, 3]) pool.close() pool.join() print(results) ```

      在这个例子中,我们试图创建一个Pool,但是__init__方法没有被实例化,因此Pool将会抛出一个异常。

      解决这个问题的方法是确保__init__方法已经被实例化。例如,你可以使用Pool的构造函数来创建Pool对象:

      ```python import multiprocessing

      def worker(): print("Worker process is running")

      if name == "main": pool = multiprocessing.Pool(pool_class=Pool) results = pool.map(worker, [1, 2, 3]) pool.close() pool.join() print(results) ```

      在这个例子中,我们使用Pool的构造函数来创建Pool对象,然后我们就可以正常地使用Pool了。

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部