我正在尝试使用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(): -如果代码正确,则程序将继续运行并按预期方式运行 -如果代码中有错误,则程序似乎不会调用提交的函数,无论它做什么:它不会报告代码中的错误
答案 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
让我知道它是否仍然无法正常工作