concurrent.futures.ThreadPoolExecutor не печатает ошибок - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь использовать модуль concurrent.futures.ThreadPoolExecutor для параллельного запуска метода класса. Упрощенная версия моего кода выглядит следующим образом:

class TestClass:

    def __init__(self, secondsToSleepFor):

        self.secondsToSleepFor = secondsToSleepFor


    def testMethodToExecInParallel(self):

        print("ThreadName: " + threading.currentThread().getName())


        print(threading.currentThread().getName() + " is sleeping for " + str(self.secondsToSleepFor) + " seconds")


        time.sleep(self.secondsToSleepFor)


        print(threading.currentThread().getName() + " has finished!!")


with concurrent.futures.ThreadPoolExecutor(max_workers = 2) as executor:

    futuresList = []

    print("before try")

    try:

         testClass = TestClass(3)        

         future = executor.submit(testClass.testMethodToExecInParallel)

         futuresList.append(future)

    except Exception as exc:

         print('Exception generated: %s' % exc)

Если я выполняю этот код, кажется,вести себя так, как задумано.Но если я ошибаюсь, например, указываю неправильное количество параметров в «testMethodToExecInParallel», например:

 def testMethodToExecInParallel(self, secondsToSleepFor):

, а затем все равно отправляю функцию как:

future = executor.submit(testClass.testMethodToExecInParallel)

или пытаюсь объединитьстроковый объект с целочисленным объектом (без использования str (.)) внутри оператора print в методе «testMethodToExecInParallel»:

def testMethodToExecInParallel(self):

        print("ThreadName: " + threading.currentThread().getName())
        print("self.secondsToSleepFor: " + self.secondsToSleepFor) <-- Should report an Error here

программа не возвращает никакой ошибки;просто печатает «перед попыткой» и заканчивает выполнение ...

Тривиально понять, что это делает программу почти не подлежащей отладке ... Может кто-нибудь объяснить мне, почему такое поведение происходит?

(для первого случая ошибки) concurrent.futures.ThreadPoolExecutor не проверяет функцию с указанной подписью для отправки и, в конце концов, выдает какое-то исключение "noSuchFunction"?

Может быть, есть какая-то проблема в отправке методов класса ThreadPoolExecutor вместо простых автономных функций, и, таким образом, такое поведение можно ожидать?

Или, возможно, ошибка возникает в потоке, и по какой-то причине я могуне читаете?

- РЕДАКТИРОВАТЬ -

Akshay.N предложение о вставке future.result () после отправки функций в ThreadPoolExecutor заставляет программу вести себя как положено: хорошо работает, если код правильный, печатает ошибку, если что-то в коде неверно.

Я думаю, что пользователи должны быть предупреждены об этом очень странном поведении ThreadPoolExecutor: если вы только отправляете функции в ThreadPoolExecutor БЕЗ ВЫЗЫВАработает и ведет себя как ожидалось - если в коде что-то не так, кажется, что программа не вызывает переданную функцию, что бы она ни делала: она не сообщает об ошибках в коде

1 Ответ

0 голосов
/ 20 февраля 2019

Насколько мне известно, что это "не так далеко", вы должны вызвать "e.results ()" после "executor.submit (testClass.testMethodToExecInParallel)", чтобы выполнить пул потоков.Я попробовал то, что вы сказали, и это дает мне ошибку, ниже код

>>> import concurrent.features as cf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'concurrent.features'
>>> import concurrent.futures as cf
>>> executor = cf.ThreadPoolExecutor(1)
>>> def a(x,y):
...     print(x+y)
...
>>> future = executor.submit(a, 2, 35, 45)
>>> future.result()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\username 
\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\_base.py", line 
425, in result
    return self.__get_result()
  File "C:\Users\username
\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\_base.py", line 
384, in __get_result
    raise self._exception
  File "C:\Users\username
\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\thread.py", line 
57, in run
    result = self.fn(*self.args, **self.kwargs)
TypeError: a() takes 2 positional arguments but 3 were given

Дайте мне знать, если это все еще не работает

...