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