使用ThreadPoolExecutor时,在Django测试中保存到数据库

时间:2016-08-06 19:35:57

标签: python django postgresql concurrency django-testing

我试图使用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和鼻子运行测试。任何关于为什么这种方法可能出错的帮助或想法都会受到赞赏。

0 个答案:

没有答案