python - 为什么我在使用 multiprocessing.Pool 时遇到异常?

标签 python multiprocessing

这是我的代码:

import multiprocessing

class Worker:
    def run(self, msg):
        print '%s, it works!' % msg

def start_process():
    print 'Starting',multiprocessing.current_process().name

if __name__=='__main__':
    pool = multiprocessing.Pool(processes=2, initializer=start_process,)
    pool.apply_async(Worker().run, args=('congbo',))
    pool.close()
    pool.join()

但是我在控制台中遇到异常:

Starting PoolWorker-1
Starting PoolWorker-2
Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

我刚刚将 class.func 传递给 pool.apply_async(),但出现异常。 谁能告诉我如何将 class.func 传递给 pool.apply_async(), 3x!!!

最佳答案

作为类一部分的函数不称为函数,它们称为方法,并且您不能将对象实例的方法传递给 apply_async(),您需要使用函数。

这样做的原因是,多处理就是在多个进程中执行操作,当您传递实例方法时,您传递的是对象的一部分。并且该对象仅存在于其中一个进程中,因此其他进程无法访问它。

改变你的

class Worker:
    def run(self, msg):
        print '%s, it works!' % msg

def run(msg):
    print '%s, it works!' % msg

使用它,它应该可以工作。

关于python - 为什么我在使用 multiprocessing.Pool 时遇到异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656979/

相关文章:

Python 多处理队列可扩展到大量工作线程

python - 在长时间运行的任务中终止 QThread 和 multiprocessing.pool 进程

python - input() 函数的存在会导致多处理失败。这背后的原因是什么?

python - 解压缩文件并将其内容保存到数据库中

python - 按顺序遍历多个排序列表

python - python的递归itemgetter

python - 避免用户中止 python 子进程

python - 多处理模块和pyro的比较?

java - jpype 简单 jar 导入并运行 main()

python - 如何使用atom-ide-debugger-python来调试python代码,包括。变量监视和断点