parallel.futures.ThreadPoolExecutor不会显示错误

时间:2019-02-20 02:28:23

标签: python python-3.x multithreading concurrent.futures

我正在尝试使用current.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)

或尝试在“ testMethodToExecInParallel”方法中的打印语句内将字符串对象与整数对象(不使用str(。))连接:

def testMethodToExecInParallel(self):

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

程序不返回任何错误;只是打印“尝试之前”并结束执行...

很容易理解,这使得程序几乎不可言喻...有人可以解释一下为什么会发生这种现象吗?

(对于第一种错误的情况)current.futures.ThreadPoolExecutor是否不检查具有指定签名的函数以提交,并最终引发某种“ noSuchFunction”异常?

在提交给ThreadPoolExecutor类方法而不是简单的独立函数时可能存在某种问题,因此,这种行为是可以预期的吗?

或者错误可能是在线程内部抛出的,由于某种原因我无法读取它?

-编辑-

Akshay.N建议在将函数提交给ThreadPoolExecutor之后插入future.result(),以使程序按预期方式运行:如果代码正确,则执行很好;如果代码中的错误,则打印错误。

我必须警告用户有关ThreadPoolExecutor的这种非常奇怪的行为: 如果您仅将函数提交给ThreadPoolExecutor ,然后再调用future.result(): -如果代码正确,则程序将继续运行并按预期方式运行 -如果代码中有错误,则程序似乎不会调用提交的函数,无论它做什么:它不会报告代码中的错误

1 个答案:

答案 0 :(得分:0)

据我所知,这不是“到目前为止”,您必须在“ executor.submit(testClass.testMethodToExecInParallel)”之后调用“ e.results()”以执行线程池。 我已经尝试了您所说的内容,但它给了我错误,下面是代码

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

让我知道它是否仍然无法正常工作