Python多处理 - TypeError:' Nonetype'对象不可调用

时间:2015-03-10 10:45:16

标签: python multiprocessing

使用PySQLPool时,我遇到了Python多处理库的问题。这导致我得到以下异常:'TypeError: 'NoneType' object is not callable'

我使用多处理创建一个Pool,并在虚函数上调用Pool.map。在map的参数中,我包含了来自PySQLPool的连接。我已经包含了可以重现以下错误的最小代码:

from config import *
import PySQLPool
import multiprocessing as mp
def a(b):
    return b
PySQLPool.getNewPool().maxActiveConnections = 5
connection = PySQLPool.getNewConnection(user=USER,
                    passwd=PASSWORD,
                    host='localhost',
                    db=DATABASE,
                    use_unicode=True,
                    charset='utf8',
                    commitOnEnd=False)
pool = mp.Pool(processes=8)
args = [(connection)]
result_list = pool.map(a, args, 8)
pool.close()
pool.join()

导致以下错误:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/root/.pyenv/versions/2.7.6/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/root/.pyenv/versions/2.7.6/lib/python2.7/threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/root/.pyenv/versions/2.7.6/lib/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
    put(task)
TypeError: 'NoneType' object is not callable

我用pip安装了以下内容

(venv)root@Ubuntu-1204-precise-64-minimal:/usr/share/python-multiproc/src# pip list
MySQL-python (1.2.5)
pip (6.0.8)
PySQLPool (0.3.8)
setuptools (12.0.5)

我在Ubuntu 12.04上使用Python 2.7.3,2.7.6和2.7.9进行了测试。还在Windows 8上使用Python 2.7.9进行了测试。 此外,我尝试过使用PySQLPool 0.3.8和0.4。

这是什么原因以及如何调试?

1 个答案:

答案 0 :(得分:1)

此晦涩的错误可能来自传递给被调用函数的损坏的自变量。由于出现了酸洗/酸洗逻辑,这种情况可能发生在复杂的对象上。

如果可能,请尝试重新编写代码,以将args的绝对最小数量传递给函数。这可能意味着在每个进程内重新创建一些对象。