Пайтон multiprocessing (Пул) ошибка

У меня есть проблема с мультиобвиняемым моей программы. Это код программы и внизу я ввожу ошибку:

Программа:

import argparse
import sys
import multiprocessing
from multiprocessing import Pool
import time

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--x", type=float, default=1.0)
    args = parser.parse_args()
    sys.stdout.write(str(numeroprimo()))

num = input("Inserte un numero: ")


def numeroprimo():
    if int(num) > 1:
        for i in range(2, int(num)):
            if (int(num) % i) == 0:
                print(num, "no es un numero primo")
                break
        else:
            print(num, "es un numero primo")
    else:
        print(num, "no es un numero primo")


if __name__ == "__main__":
    main()
    t1 = time.time()
    for x in range(1):
        p = Pool()
        p.map(numeroprimo(), num)
        p.close()
        p.join()
    print("Tomó:", time.time()-t1)

Ошибка:

multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
  File     "C:\Users\santi\AppData\Local\Programs\Python\Python35\lib\multiprocessing\pool.    py", line 119, in worker
    result = (True, func(*args, **kwds))
  File     "C:\Users\santi\AppData\Local\Programs\Python\Python35\lib\multiprocessing\pool.    py", line 44, in mapstar
    return list(map(*args))
TypeError: 'NoneType' object is not callable
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "Prime number checker.py", line 33, in <module>
    p.map(primenumber(), num)
  File     "C:\Users\santi\AppData\Local\Programs\Python\Python35\lib\multiprocessing\pool.    py", line 260, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File     "C:\Users\santi\AppData\Local\Programs\Python\Python35\lib\multiprocessing\pool.    py", line 608, in get
    raise self._value
TypeError: 'NoneType' object is not callable
0
задан 24.01.2017, 23:30
0 ответов

В линии:

p.map(numeroprimo(), num)

С одной стороны, со скобками () ты используешь стоимость, возвращенную функцией numeroprimo, стандартная настройка которого None из-за того, что не показывает ясно ничего посредством одного return. Это ошибка, которая дает тебе.

С другой стороны, функция не использует аргументы, а следовательно ничего не стоит перемещать его переменную num. Тебе повезет, которого я разорил ее из-за того, что был глобальной переменной.

Но в случае, если numeroprimo он примет аргументы, в Pool.map ты должен перемещать его iterador как второй аргумент, нечто похожее: [num]

Повторно интерпретируя то, что ты хочешь сделать, код мог быть нечто похожим:

def numeroprimo(n):
    res = n > 1 and all(n%i != 0 for i in range(2,n))
    print("{:6d}".format(n), "sí" if res else "no", "es número primo")
    return res

if __name__ == "__main__":
    #main()
    num = input("Inserte un numero: ")
    t1 = time.time()
    with Pool() as p:
        p.map(numeroprimo, range(2, int(num)))
    print("Tomó:", time.time()-t1)
1
ответ дан 03.12.2019, 17:31
  • 1
    Большое спасибо из-за твоей помощи! –  25.01.2017, 04:00
  • 2
    @SantiagoPardal помни что пометь ответ Chema как хорошая :) –  25.01.2017, 10:11
  • 3
    Я пометил ее, но он не достает это мне, nose, из-за которого :( –  26.01.2017, 02:08

Теги

Похожие вопросы