У меня есть программа, которая долгое время не использовалась, но она уже используется и работает. Он использует многопроцессорность, поскольку одна и та же задача должна выполняться для разных данных много раз.Программа работает с map(), но вызывает TypeError с pool.map()
Теперь я коснулся программы, чтобы добавить новый параметр, протестировать его и заметить, что он вызывает ошибку. Также более ранняя версия с версией контролирует ту же ошибку. Полная ошибка выглядит так:
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 811, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.7/threading.py", line 764, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
put(task)
TypeError: 'NoneType' object is not callable
Это все. Честно говоря, это не говорит мне многого. При попытке отладить это, я пришел к идее попробовать использовать обычный map()
вместо объединенной версии pool.map
. Скрипт работает нормально.
Я не могу придумать минимальный пример, который воспроизводит ошибку, но я могу придумать пример, где все прекрасно работает, так же, как и ожидалось:
import random
import time
from multiprocessing import Pool
def do_work(x, y, z):
time.sleep(random.random() * 2)
print x + y + z
def do_one(arguments):
print "doing one"
do_work(*arguments)
def do_many(x, y, zs):
map(do_one, [(x, y, z) for z in zs])
def do_many_pooled(x, y, zs):
pool = Pool(2)
pool.map(do_one, [(x, y, z) for z in zs])
pool.close()
pool.join()
def main():
x = 1
y = 2
zs = range(10)
print "doing many"
do_many(x, y, zs)
print "doing many pooled"
do_many_pooled(x, y, zs)
if __name__ == '__main__':
main()
Настоящая программа делает много запросов базы данных, вычислений с использованием numpy и сохранения результатов обратно в базу данных. В реальной программе программа выходит с ошибкой, прежде чем печатать «делать один», когда используется с объединенной версией, но работает отлично, используя не объединенную версию.
Кто-нибудь знает, как правильно читать и отслеживать трассировку и/или может мне сказать, что может вызвать это исключение?
Возможно, вы можете использовать [map_async] (https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.map_async) и использовать [AsyncResult] (https: // docs .python.org/2/library/multiprocessing.html # multiprocessing.pool.AsyncResult) метод 'get' для повторного исключения исключения, и вы найдете дополнительную информацию? – NoamG
Какую версию Python вы используете? Python 2.7.что? – jszakmeister
@tobias_k да, я на 100% уверен. Как указано в тексте, ошибка не может быть воспроизведена в этом примере, и я не знаю, что нужно, чтобы воспроизвести ошибку с минимальным примером. – Nras