随机python模块使用线程加载失败

时间:2012-07-13 20:49:10

标签: python django google-app-engine

我正在尝试调试python import语句随机失败的错误,有时它们运行得很干净。

这是我看到的例外情况的一个例子。有时候我会看到这个,有时我会在另一个模块中看到另一个,虽然它似乎总是在4个模块中的一个模块中出现。

ERROR:root:/home/user/projecteat/django/contrib/auth/management/__init__.py:25:     RuntimeWarning: Parent module 'django.contrib.auth.management' not found while handling absolute import
from django.contrib.contenttypes.models import ContentType

由于随机性,我几乎可以肯定这是一个线程问题,但我不明白为什么会出现导入错误,所以我不确定在调试时要查找什么。如果不同的线程试图加载相同的模块,这可能是由文件系统争用引起的吗?

我正在尝试让Django 1.4的LiveServerTestCase在Google App Engine的开发服务器上运行。主线程运行django的测试框架。当它加载基于LiveServerTestCase的测试类时,它会生成一个子线程,该子线程启动App Engine dev_appserver,这是一个本地Web服务器。主线程继续运行测试,使用Selenium驱动程序发出HTTP请求,由子线程上的dev_appserver处理。

在拆除testcase类之前,测试框架可能会在基于LiveServerTestCase的类中运行一些测试。在拆解时,子线程结束。

看起来在子(HTTP服务器)线程中发生异常,主要是在单个测试用例类中的测试之间。

App Engine LiveServerTestCase类的代码位于:https://github.com/dragonx/djangoappengine/blob/django-1.4/test.py

提供此问题所需的所有调试信息非常困难。我主要是在寻找有关为什么python import语句会给RuntimeWarning错误的建议。

1 个答案:

答案 0 :(得分:0)

我对自己的问题有部分答案。发生的事情是我有两个线程正在运行。

线程1正在运行处理HTTP请求的dev_appserver(dev_appserver_main)内的主内部函数。

线程2正在运行基于Selenium的测试用例。该线程将向浏览器发送命令以执行某些操作(然后间接生成HTTP请求并在线程1中重新输入)。然后,它会向Selenium发出更多请求以检查状态,或者进行数据存储区查询以检查结果。

认为问题在于,在处理每个HTTP请求时,线程1(dev_appserver)会更改环境,以便无法访问某些文件夹(app.yaml中排除的文件夹以及环境这不是appengine的一部分)。如果线程2在这段时间碰巧运行了某些代码,如果它们位于这些文件夹中,某些导入可能无法加载。