concurrent.futures.ThreadPoolExecutor doesn't print errors

狂风中的少年 提交于 2021-02-09 09:37:25

问题


I am trying to use concurrent.futures.ThreadPoolExecutor module to run a class method in parallel, the simplified version of my code is pretty much the following:

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)

If I execute this code it seems to behave like it is intended to. But if I make a mistake like specifying a wrong number of parameters in "testMethodToExecInParallel" like:

 def testMethodToExecInParallel(self, secondsToSleepFor):

and then still submitting the function as:

future = executor.submit(testClass.testMethodToExecInParallel)

or trying to concatenate a string object with an integer object (without using str(.) ) inside a print statement in "testMethodToExecInParallel" method:

def testMethodToExecInParallel(self):

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

the program doesn't return any error; just prints "before try" and ends execution...

Is trivial to understand that this makes the program nearly undebuggable... Could someone explain me why such behaviour happens?

(for the first case of mistake) concurrent.futures.ThreadPoolExecutor doesn't check for a function with the specified signature to submit and, eventually, throw some sort of "noSuchFunction" exception?

Maybe there is some sort of problem in submitting to ThreadPoolExecutor class methods instead of simple standalone functions and, so, such behaviour could be expected?

Or maybe the error is thrown inside the thread and for some reason I can't read it?

-- EDIT --

Akshay.N suggestion of inserting future.result() after submitting functions to ThreadPoolExecutor makes the program behave as expected: goes nice if the code is correct, prints the error if something in the code is wrong.

I thing users must be warned about this very strange behaviour of ThreadPoolExecutor: if you only submit functions to ThreadPoolExecutor WITHOUT THEN CALLING future.result(): - if the code is correct, the program goes on and behaves as expected - if something in the code is wrong seems the program doesn't call the submitted function, whatever it does: it doesn't report the errors in the code


回答1:


As far as my knowledge goes which is "not so far", you have to call "e.results()" after "executor.submit(testClass.testMethodToExecInParallel)" in order to execute the threadpool . I have tried what you said and it is giving me error, below is the code

>>> 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

Let me know if it still doesn't work



来源:https://stackoverflow.com/questions/54777947/concurrent-futures-threadpoolexecutor-doesnt-print-errors

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!