我试图使用Django的TestCase来测试一段与ThreadPoolExecutor并行化的代码。在服务器上一切正常(至少目前为止没有已知问题“手动”测试),但是当我运行我的测试时,他们的执行只会卡在save()方法上。 所以,基本上我有这样的事情:
class A(models.Model):
# something here
def start(self):
objectsB = []
for i in range(n):
objectB = B(i)
objectsB.append(objectB)
results = []
with concurrent.futures.ThreadPoolExecutor(max_workers=len(objectsB)) as executor:
futures = [executor.submit(objectB.start) for objectB in objectsB]
for future in concurrent.futures.as_completed(futures):
results.append(future.result())
return results
class B(models.Model):
# something here
def start(self):
# some logic here (including reading from database)
response = requests.post('http://www.externalapi.com')
# some logic here
print('during test this is printed')
self.save()
print('during test this is never reached')
当我使用相同的代码而没有并发时,只是按顺序执行objectB.start
,测试工作正常。在对象B的方法start
中读取数据库的调用似乎也有效。我正在使用Django 1.9,python 3.5,postgresql 9.5.3和鼻子运行测试。任何关于为什么这种方法可能出错的帮助或想法都会受到赞赏。